2017-09-26 79 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