2011-02-09 18 views
1

我有一個查詢,其代碼如下所示:如何調換記錄列成行

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

ComplexSubquery是被使用,咄計算所有的數值領域,複雜的子查詢。

我想用這個查詢作爲子查詢,生成類似以下的彙總查詢:

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

其中:

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

我怎麼能這樣做在SQL Server ?


注:我知道我可以通過丟棄原來的查詢和使用工會避免此問題:

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 
... 

但我想避免這條路線,因爲多餘的代碼,使我的眼睛流血。 (此外,未來複雜子查詢的數量確實存在增長的可能性。)

+0

你有沒有看`unpivot`? – 2011-02-09 23:00:43

+0

不是那是什麼? – pyon 2011-02-09 23:02:02

回答

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 

返回

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

從您的示例中,我不是100%肯定的,但也許PIVOT運算符會幫助您在此處?我認爲如果您將原始查詢選擇到臨時表中,您可以在文檔ID上進行轉碼並獲得其他查詢的總和。

雖然我沒有太多的經驗,所以我不確定你的子查詢有多複雜 - 你可能不得不分解它。

+0

逆運算符「UNPIVOT」實際上是我需要的。不過謝謝,無論如何。 – pyon 2011-02-09 23:18:51