2010-12-03 51 views
0

Lutter avec cela un peu dans SQL Server, des idées? Compte tenu de ces données (ID est un INT, le reste sont BITS):Pivot/agrégation avec des colonnes de pourcentage possibles dans t-sql?

------------------------------------------ 
ID Type1 Type2 AttrA AttrB AttrC 
------------------------------------------ 
1 1  0  1  0  0 
2 1  0  1  0  0 
3 1  1  0  1  1 
4 0  1  1  1  0 
5 1  1  1  1  0 

Je voudrais produire ce rapport:

--------------------------------------------------------- 
Attr NumOfType1 PctOfType1 NumOfType2 PctOfType2 
--------------------------------------------------------- 
AttrA 3   75%   2   67% 
AttrB 2   50%   3   100% 
AttrC 1   25%   1   33% 
Total 4   N/A   3   N/A 

Merci!

Jim

Répondre

2
;WITH YourBaseTable AS 
(
SELECT 1 ID, 1 Type1,0 Type2, 1 AttrA, 0 AttrB, 0 AttrC UNION ALL 
SELECT 2 ID, 1 Type1,0 Type2, 1 AttrA, 0 AttrB, 0 AttrC UNION ALL 
SELECT 3,1,1,0,1,1 UNION ALL 
SELECT 4,0,1,1,1,0 UNION ALL 
SELECT 5,1,1,1,1,0 
), T AS 
(
SELECT *, 1 AS Total 
FROM YourBaseTable 
) 
SELECT 
Attr, 
COUNT(CASE WHEN VALUE = 1 AND Type1 = 1 THEN 1 END) NumOfType1, 
CASE WHEN Attr <> 'Total' THEN 100 * CAST(COUNT(CASE WHEN VALUE = 1 AND Type1 = 1 THEN 1 END) AS FLOAT)/COUNT(CASE WHEN Type1 = 1 THEN 1 END) END PctOfType1, 
COUNT(CASE WHEN VALUE = 1 AND Type2 = 1 THEN 1 END) NumOfType2, 
CASE WHEN Attr <> 'Total' THEN 100 * CAST(COUNT(CASE WHEN VALUE = 1 AND Type2 = 1 THEN 1 END) AS FLOAT)/COUNT(CASE WHEN Type2 = 1 THEN 1 END) END PctOfType2 
FROM T 
UNPIVOT 
(VALUE FOR Attr IN (AttrA, AttrB,AttrC, Total)) AS unpvt 
GROUP BY Attr 
+0

Cool, merci! Que puis-je faire pour aider à clarifier la logique? Est-ce le pourcentage des colonnes (ceux-ci semblent être le peu difficile)? Le pourcentage est le nombre d'un type/attribut donné divisé par le nombre total de ce type. Dans mes exemples de données ci-dessus, il y a 4 enregistrements Type1 et 3 enregistrements Type2. Je pense peut-être à une requête AVEC pour obtenir les totaux, qui peuvent être utilisés dans le calcul des pourcentages? Pas certain. –

+0

@Jim - Cela devrait être incorporé dans ma réponse maintenant. –

+0

Wow, Martin, c'est génial, merci beaucoup! –