我有以下数据集,这是查询的结果:
╔══════╦══════════╦══════════╦═════════════╦═══════════╦════════════╗
║ 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实现这一目标。
感谢您的帮助!
答案 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)
您可以使用组合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?