2017-09-26 16 views
2

クエリに問題があります。私はこのようになり、列数の多い製品と呼ばれるテーブルを持っている:SQL Server - 列名と列の合計を取得するクエリ

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

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

それから私は、出力列名と、このような彼らの合計意志クエリを開発したいです何か案は?事前

+5

ヒント:ピボット.... – scsimon

+0

は動的か列挙されていますか? –

+0

scsimon +/- 10kカラム。ヒントに感謝し、それを掘り下げようとしています。 RadimBaca、fixed – 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あなたが期待される結果を達成するためにSUMunpivotを使用することができ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

を使用することができます。このような多数の属性の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 
関連する問題