Ich möchte die Spalte mit ihrer Summe in Zeilen konvertieren.

Quellentabelle:

+------+-------+-------+-------+
| Name | TypeA | TypeB | TypeC |
+------+-------+-------+-------+
| A    |    10 |     3 |    53 |
| B    |    25 |   543 |     5 |
| B    |    30 |     5 |     5 |
| B    |    21 |     3 |     5 |
| C    |    23 |     2 |   278 |
| C    |     0 |     3 |     7 |
+------+-------+-------+-------+

Erforderliches Ergebnis:

+-------+----------+
| Type  | SumTotal |
+-------+----------+
| TypeA |      109 |
| TypeB |      559 |
| TypeC |      353 |
+-------+----------+
1
Teknas 22 Feb. 2020 im 15:31

3 Antworten

Der Ansatz von UNPIVOT und Gordon wäre eindeutig leistungsfähiger. Wenn Sie jedoch eine Variable oder zahlreiche Spalten haben, finden Sie hier eine Technik, mit der Sie Ihre Daten dynamisch aufheben können, ohne tatsächlich dynamisches SQL zu verwenden.

Beispiel

Declare @YourTable Table ([Name] varchar(50),[TypeA] int,[TypeB] int,[TypeC] int)
Insert Into @YourTable Values 
 ('A',10,3,53)
,('B',25,543,5)
,('B',30,5,5)
,('B',21,3,5)
,('C',23,2,278)
,('C',0,3,7)

Select C.Item
      ,Value = sum(C.value)
 From @YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                      ,Value = xAttr.value('.','int')
                 From  XMLData.nodes('//@*') xNode(xAttr)
                 Where xAttr.value('local-name(.)','varchar(100)') not in ('Name','Other','ColumnsToExclude')
             ) C
 Group By C.Item

Rückgabe

Item    Value
TypeA   109
TypeB   559
TypeC   353
0
John Cappelletti 22 Feb. 2020 im 15:35

Mit UNPIVOT können Sie die Spalte wie folgt in eine Zeile ändern

SELECT TypeValue, SumTotal
FROM (select sum(TypeA) as TypeA, Sum(TypeB) as TypeB, Sum(TypeC) as TypeC from YourTable) AS t
UNPIVOT
(
  SumTotal
  FOR TypeValue IN([TypeA], [TypeB], [TypeC])
) AS u;
0
Ranjit Singh 22 Feb. 2020 im 13:01

Sie möchten die Daten aufheben und dann aggregieren. Ich empfehle die Verwendung von APPLY und dann GROUP BY:

select v.type, sum(v.val)
from t cross apply
     (values ('TypeA', TypeA), ('TypeB', TypeB), ('TypeC', TypeC)
     ) v(type, val)
group by v.type;
2
Gordon Linoff 22 Feb. 2020 im 12:34