2017-09-26 96 views
2

查詢困難。我有一個表稱爲產品具有大量列,看起來像這樣:SQL Server - 用於檢索列名和列總和的查詢

X | Y | Z | ... (and on) 
----+-----+-----+ 
4 | 9 | 4 | 
5 | 2 | 6 | 
2 | 5 | 9 | 

然後我想建立一個查詢,將輸出列名稱和它們的和是這樣的:

ProductName | Quantity 
-------------+----------- 
    X  |  11 
    Y  |  16 
    Z  |  19 
... 

有任何想法嗎?

在此先感謝

+5

提示:樞軸.... – scsimon

+0

是列名是動態還是它們的列表是固定的? –

+0

scsimon +/- 10k列。並感謝提示,我們將深入研究。 RadimBaca,固定 – schustda

回答

4

當然UNPIVOT也許動態SQL將是更好的性能,但下面將「動態」逆透視和總yourdata。

請注意,此行轉換爲XML和NULL值將被排除在外

Select ProductName = C.Field 
     ,Quanity  = sum(C.Value) 
From YourTable A 
Cross Apply (values (cast((Select A.* for XML RAW) as xml))) B(XMLData) 
Cross Apply (
       Select Field = a.value('local-name(.)','varchar(100)') 
         ,Value = a.value('.','int')   --<< Change to desired data type 
       From B.XMLData.nodes('/row') as C1(n) 
       Cross Apply C1.n.nodes('./@*') as C2(a) 
       Where a.value('local-name(.)','varchar(100)') not in ('FieldsTo','Exclude') 
      ) C 
Group By C.Field 

返回

ProductName Quanity 
X   11 
Y   16 
Z   19 

如果它與幫助子查詢可視化生成:

enter image description here

+0

約翰,我喜歡這個子查詢的想法。完美工作。 – schustda

0

假設你的表稱爲yourtbl可以使用UNPIVOT

Select productName, SUM(Quantity) Quantity 
from 
(
select productName, Quantity 
from 
(
select * 
from yourtbl 
)src 
UNPIVOT 
(
Quantity for ProductName in ([X],[Y],[Z]) 
)up 
)t group by productName 
0

您可以使用unpivotSUM達到預期的結果。要爲這麼多屬性創建SQL,我一定會使用動態T-SQL。

SELECT ProductName, Quantity 
FROM (
    SELECT SUM(X) x, SUM(y) y, SUM(z) z FROM your_table 
) 
UNPIVOT 
( 
    Quantity FOR ProductName IN (X, Y, Z) 
) AS t