2011-02-09 4 views
1
recordset

J'ai une requête dont le code ressemble à ceci:Comment transposer les colonnes en lignes

SELECT DocumentID, ComplexSubquery1 ... ComplexSubquery5 
FROM Document 
WHERE ... 

ComplexSubquery sont tous les champs numériques qui sont calculés à l'aide, duh, complexes sous-requêtes.

Je voudrais utiliser cette requête comme une sous-requête à une requête qui génère un résumé comme le suivant:

Field   DocumentCount   Total 
    1     dc1     s1 
    2     dc2     s2 
    3     dc3     s3 
    4     dc4     s4 
    5     dc5     s5 

Où:

dc<n> = SUM(CASE WHEN ComplexSubquery<n> > 0 THEN 1     END) 
s <n> = SUM(CASE WHEN Field = n    THEN ComplexSubquery<n> END) 

Comment pourrais-je faire dans SQL Server ?


REMARQUE: Je sais que je pourrais éviter le problème en supprimant la requête initiale et en utilisant les syndicats:

SELECT '1' AS TypeID, 
     SUM(CASE WHEN ComplexSubquery1 > 0 THEN 1 END) AS DocumentCount 
     SUM(ComplexSubquery1)       AS Total 
FROM (SELECT DocumentID, BLARGH ... AS ComplexSubquery1) T 
UNION ALL 
SELECT '2' AS TypeID, 
     SUM(CASE WHEN ComplexSubquery2 > 0 THEN 1 END) AS DocumentCount 
     SUM(ComplexSubquery2)       AS Total 
FROM (SELECT DocumentID, BLARGH ... AS ComplexSubquery2) T 
UNION ALL 
... 

Mais je veux éviter cette voie, parce que le code redondant fait mes yeux saignent. (En outre, il y a une réelle possibilité que le nombre de sous-requêtes complexes croisse dans le futur.)

+0

Avez-vous regardé 'unpivot'? –

+0

Non. Qu'est-ce que c'est? – pyon

Répondre

3
WITH Document(DocumentID, Field) As 
(
SELECT 1, 1 union all 
SELECT 2, 1 union all 
SELECT 3, 2 union all 
SELECT 4, 3 union all 
SELECT 5, 4 union all 
SELECT 6, 5 union all 
SELECT 7, 5 
), CTE AS 
(
SELECT DocumentID, 
     Field, 
     (select 10) As ComplexSubquery1, 
     (select 20) as ComplexSubquery2, 
     (select 30) As ComplexSubquery3, 
     (select 40) as ComplexSubquery4, 
     (select 50) as ComplexSubquery5 
FROM Document 
) 
SELECT Field, 
     SUM(CASE WHEN RIGHT(Query,1) = Field AND QueryValue > 1 THEN 1 END) AS DocumentCount, 
     SUM(CASE WHEN RIGHT(Query,1) = Field THEN QueryValue END) AS Total 
FROM CTE 
UNPIVOT (QueryValue FOR Query IN 
     (ComplexSubquery1, ComplexSubquery2, ComplexSubquery3, 
     ComplexSubquery4, ComplexSubquery5) 
)AS unpvt 
GROUP BY Field 

Retours

Field  DocumentCount Total 
----------- ------------- ----------- 
1   2    20 
2   1    20 
3   1    30 
4   1    40 
5   2    100 
+0

Est-ce spécifique à SQL Server 2008? – pyon

+0

@Eduardo - 2005 et plus. –

0

Je ne suis pas 100% positif de votre exemple, mais peut-être l'opérateur PIVOT vous aidera-t-il ici? Je pense que si vous avez sélectionné votre requête d'origine dans une table temporaire, vous pouvez pivoter sur l'ID du document et obtenir les sommes pour les autres requêtes. Je n'ai pas beaucoup d'expérience avec cela, donc je ne suis pas sûr de la complexité de vos sous-requêtes - vous pourriez avoir à le décomposer.

+0

L'opérateur inverse, 'UNPIVOT', était réellement ce dont j'avais besoin. Mais merci quand même. – pyon

Questions connexes