sql - 使用 t-sql 进行透视转换

标签 sql sql-server-2008 tsql ssis business-intelligence

SSIS有一个称为透视转换的任务,可以将列更改为行, 但是如何使用 t-sql 在 sql server 中执行相同的任务?

这是我的示例表

location product qty
-----------------------
delhi     PEPSI   100
GURGAON   CAKE    200
NOIDA     APPLE   150
delhi     cake    250

因此,在使用 ssis 工具将位置作为 setkey 并将产品作为枢轴键进行枢轴转换后,o/p 变为

location pepsi cake apple
delhi     100 null null
GURGAON   null 200 null 
NOIDA     null null 150 
delhi     null 250  null

最佳答案

使用PIVOT表运算符如下:

SELECT *
FROM tablename
PIVOT
(
  MAX(qty)
  FOR product IN([pepsi], [cake], [apple])
) as p;

请注意:

  • 我使用了 MAX 聚合函数和 qty,如果您想获得总和,请使用 SUM 或任何其他函数而是聚合函数。

  • 您必须手动写入要旋转的列的值,如果您想动态执行此操作而不是手动写入它们,则必须使用动态 sql 来执行此操作。

像这样:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(product)
                      FROM tablename
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '');

SELECT @query = 'SELECT *
FROM tablename
PIVOT
(
  MAX(qty)
  FOR product IN(' + @cols + ')) AS p;';

execute(@query);

关于sql - 使用 t-sql 进行透视转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19243821/

相关文章:

sql-server - 如何在 SQL Server 2008 Express 中安装企业管理器?

sql-server - 在 t-sql 中是否可以使用一种 foreach 语句?

mysql - 根据添加的 friend 显示评论的复杂查询

c# - 为什么相同的软件比以前花费更多的时间?

sql - DB2错误: SQL subselect error not recognized

sql - 如果数据跨越多个表,SQL Server 是否可以在不修改查询的情况下自动从多个表中读取?

sql-server - 消息 319,级别 15,状态 1, "Incorrect syntax near the keyword ' 带有“。”

java - MSSQL 2005 - JDBC4 和子查询

php - MySQL-跨多列添加行总计

c# - 如何获取 Facebook 应用程序的当前在线用户列表?