如何在sql server中应用pivot

时间:2015-07-11 20:14:31

标签: sql sql-server

我有一个我想要旋转的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上尝试了几个例子,但无法弄清楚如何为此编写查询。

我正在跳过光标代码,因为它是大的方式,这就是我想使用数据透视的原因。

2 个答案:

答案 0 :(得分:3)

非常有趣:

SQL Fiddle

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