TSQL / MS SQL Server 2012:SQL查询 - 透视和分组

时间:2018-06-15 07:58:55

标签: sql sql-server tsql

我有以下数据集,这是查询的结果:

╔══════╦══════════╦══════════╦═════════════╦═══════════╦════════════╗
║ Year ║ ItemCode ║ ItemName ║ ItmsGrpNam  ║ GroupCode ║   OutQty   ║
╠══════╬══════════╬══════════╬═════════════╬═══════════╬════════════╣
║ 2012 ║     1118 ║ Item 1   ║ Instruments ║       104 ║ 26.000000  ║
║ 2012 ║     1118 ║ Item 1   ║ Instruments ║       100 ║ 264.000000 ║
║ 2012 ║     1119 ║ Item 2   ║ Instruments ║       104 ║ 4.000000   ║
║ 2012 ║     1119 ║ Item 2   ║ Instruments ║       100 ║ 72.000000  ║
║ 2012 ║     1120 ║ Item 3   ║ Instruments ║       104 ║ 4.000000   ║
║ 2012 ║     1120 ║ Item 3   ║ Instruments ║       100 ║ 61.000000  ║
║ ...  ║          ║          ║             ║           ║            ║
╚══════╩══════════╩══════════╩═════════════╩═══════════╩════════════╝

显示按客户组(GroupCode)和年(年)销售的产品数量。

我现在想要将表转换为如下所示:

╔══════════╦══════════╦═════════════╦═══════════════╦═══════════════╦═══════════════╦═══════════════╗
║ ItemCode ║ ItemName ║ ItmsGrpNam  ║ 2012OutQty100 ║ 2012OutQty104 ║ 2013OutQty100 ║ 2013OutQty104 ║
╠══════════╬══════════╬═════════════╬═══════════════╬═══════════════╬═══════════════╬═══════════════╣
║ 1118     ║ Item 1   ║ Instruments ║ 264.000000    ║ 26.000000     ║             0 ║             0 ║
║ 1119     ║ Item 2   ║ Instruments ║ 72.000000     ║ 4.000000      ║             0 ║             0 ║
║ 1120     ║ Item 3   ║ Instruments ║ 61.000000     ║ 4.000000      ║             0 ║             0 ║
║ ...      ║          ║             ║               ║               ║               ║               ║
╚══════════╩══════════╩═════════════╩═══════════════╩═══════════════╩═══════════════╩═══════════════╝

因此,Year和GroupCode的组合成为一列并显示相应的OutQty。

我完全不知道如何使用SQL实现这一目标。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

可以通过使用动态旋转来实现。

这是一种方法:

示例表和数据

create table dbo.TestTable (
[year] int,
itemcode int,
itemname nvarchar(50),
itemGrpName nvarchar(50),
GroupCode int,
Qty numeric(18,6),
PivotColumn nvarchar(50)
)

insert into TestTable
values 

( 2012 ,     1118 ,'Item 1','Instruments',     104 ,26.000000 ,'2012OutQty104'),
( 2012 ,     1118 ,'Item 1','Instruments',     100 ,264.000000,'2012OutQty100'),
( 2012 ,     1119 ,'Item 2','Instruments',     104 ,4.000000  ,'2012OutQty104'),
( 2012 ,     1119 ,'Item 2','Instruments',     100 ,72.000000 ,'2012OutQty100'),
( 2012 ,     1120 ,'Item 3','Instruments',     104 ,4.000000  ,'2012OutQty104'),
( 2012 ,     1120 ,'Item 3','Instruments',     100 ,61.000000 ,'2012OutQty100')

SQL脚本

DECLARE @Str NVARCHAR(MAX);
DECLARE @Str2 NVARCHAR(MAX);
SELECT @Str = STUFF(
                   (
                       SELECT DISTINCT
                              ','+QUOTENAME(PivotColumn)
                       FROM dbo.TestTable FOR XML PATH('')
                   ), 1, 1, '');
 --PRINT @Str
SET @str2 = N'select * from (
   select ItemCode,ItemName,ItemGrpName,PivotColumn,Qty
   from  dbo.TestTable
   )x
   PIVOT 
   (sum(Qty) FOR PivotColumn in ('+@Str+')
   ) as p';
--PRINT @Str2;
EXEC (@Str2);

答案 1 :(得分:0)

您可以使用临时表和pivot来实现它!

您可以使用组合Year和GroupCode

的新列创建临时表
SELECT *
INTO #Temp
FROM
    (select Year, ItemCode, ItemName, ItmsGrpNam, GroupCode, OutQty, concat(Year,'OutQty',GroupCode ) as NewColumn
    from MyTable)

然后使用枢轴,您可以获得所需的结果。

根据有多少不同的值(为了成为新列),您可以使用动态数据透视来获取所有不同的值。

对于动态支点,这里有一个答案: SQL Server dynamic PIVOT query?