sql - 如何在sql server中应用pivot

标签 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,在“总计”列中为 20。

我可以通过在 table1 上使用光标并形成 table2 来完成此操作。 但这不是最好的方法。我上网查了一下,发现可以使用Pivot,但这里无法应用Pivot。有人可以帮我在这里应用枢轴吗?

尝试了 stackoverflow 上的几个示例,但无法弄清楚如何为此编写查询。

我在这里跳过光标代码,因为它太大了,这就是我想使用枢轴的原因。

最佳答案

非常有趣:

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 |

关于sql - 如何在sql server中应用pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31361388/

相关文章:

sql - 是否有任何单个 sql 命令可以将整个数据库从一个 sql 服务器导出到另一台?

mysql - SQL 在 varchar 中按日期选择订单

sql - 在 SQL Server 中,当在具有聚集索引的表上使用 TOP 时,默认情况下是确定性的吗?

sql - Grails:带有可选关联的 "where"查询

mysql - 反对不归还分数

sql-server - 如何将特定模式的数据从 SQL Server 2014 (Unicode) 导入 Hive 仓库

sql-server - 为什么 READ_COMMITTED_SNAPSHOT 默认情况下未启用?

sql-server - MSSQL记录日期/时间自动删除

sql-server - 如何将数据从数据库推送到应用程序?

sql-server - tsql : how to export query results to . csv?