我有一个我想要旋转的sql表。例如:
来自:
Id U-num Item Count Q1 Q2
1 11 item1 10 32 1
1 11 item2 5 7 9
1 11 item3 5 8 0
2 12 item1 20 132 0
2 12 item2 30 32 0
2 12 item3 20 0 0
3 4 item1 10 322 0
3 4 item2 10 2 22
3 4 item3 20 32 55
到:
Id U-num Total Item1-Q1 Item1-Q2 Item2-Q1 Item2-Q2 Item3-Q1 Item3-q2
1 11 20 32 1 7 9 8 0
2 12 70 132 0 32 0 0 0
3 4 40 322 0 2 22 32 55
总计列每个ID的计数列总和。例如,Id 1的计数为10,5,5,在Total列中为20。
我可以通过在table1上使用游标并形成table2来实现。 但这不是最好的方法。我在网上查了一下,发现我可以使用Pivot,但无法在这里应用数据透视。有人可以帮我在这里申请支点吗?
在stackoverflow上尝试了几个例子,但无法弄清楚如何为此编写查询。
我正在跳过光标代码,因为它是大的方式,这就是我想使用数据透视的原因。
答案 0 :(得分:3)
非常有趣:
MS SQL Server 2014架构设置:
create table t (Id int, Unum int, Item varchar(20), c int, Q1 int, Q2 int);
insert into t values
(1 , 11 ,'item1', 10 , 32 , 1),
(1 , 11 ,'item2', 5 , 7 , 9),
(1 , 11 ,'item3', 5 , 8 , 0),
(2 , 12 ,'item1', 20 , 132 , 0),
(2 , 12 ,'item2', 30 , 32 , 0),
(2 , 12 ,'item3', 20 , 0 , 0),
(3 , 4 ,'item1', 10 , 322 , 0),
(3 , 4 ,'item2', 10 , 2 , 22),
(3 , 4 ,'item3', 20 , 32 , 55);
查询1 :
;with cte as (
select Id, Unum, item + '-Q1' as Q, Q1 as v,
sum(c) over ( partition by Id) as T from t
union all
select Id, Unum, item + '-Q2' as Q, Q2 as v,
sum(c) over ( partition by Id ) as T from t )
SELECT Id, Unum, T, [Item1-Q1], [Item1-Q2],
[Item2-Q1], [Item2-Q2],
[Item3-Q1], [Item3-q2]
FROM CTE
PIVOT
(
sum (v)
FOR Q IN
( [Item1-Q1], [Item1-Q2],
[Item2-Q1], [Item2-Q2],
[Item3-Q1], [Item3-q2] )
) AS pvt
ORDER BY ID
<强> Results 强>:
| Id | Unum | T | Item1-Q1 | Item1-Q2 | Item2-Q1 | Item2-Q2 | Item3-Q1 | Item3-q2 |
|----|------|----|----------|----------|----------|----------|----------|----------|
| 1 | 11 | 20 | 32 | 1 | 7 | 9 | 8 | 0 |
| 2 | 12 | 70 | 132 | 0 | 32 | 0 | 0 | 0 |
| 3 | 4 | 40 | 322 | 0 | 2 | 22 | 32 | 55 |
答案 1 :(得分:1)
我们可以使用CROSS APPLY和PIVOT
来获得相同的结果集declare @t table (Id int, Unum int, Item varchar(20), c int, Q1 int, Q2 int);
insert into @t values
(1 , 11 ,'item1', 10 , 32 , 1),
(1 , 11 ,'item2', 5 , 7 , 9),
(1 , 11 ,'item3', 5 , 8 , 0),
(2 , 12 ,'item1', 20 , 132 , 0),
(2 , 12 ,'item2', 30 , 32 , 0),
(2 , 12 ,'item3', 20 , 0 , 0),
(3 , 4 ,'item1', 10 , 322 , 0),
(3 , 4 ,'item2', 10 , 2 , 22),
(3 , 4 ,'item3', 20 , 32 , 55);
select * from (
select ID,Unum,Item +'-'+col As K,SUM(C) over ( partition by Id)/2 as T,val from @t
CROSS APPLY (values ('Q1',Q1),('Q2',Q2))CS(col,val))A
PIVOT(SUM(Val) FOR K IN ([Item1-Q1], [Item1-Q2],
[Item2-Q1], [Item2-Q2],
[Item3-Q1], [Item3-Q2]))HH