Sql 如何在两列上使用pivot函数
我试图理解如何使用SQLServer的PIVOT函数来透视2列。我所看到的大多数示例都使用了两个以上的列,我不知道在使用较少的列时如何应用 任何帮助都将不胜感激 列是购物者id和sku,我需要将购物者id放在一列中,左侧的sku用逗号分隔 以下是我需要进行数据透视的查询:Sql 如何在两列上使用pivot函数,sql,sql-server-2012,pivot-table,Sql,Sql Server 2012,Pivot Table,我试图理解如何使用SQLServer的PIVOT函数来透视2列。我所看到的大多数示例都使用了两个以上的列,我不知道在使用较少的列时如何应用 任何帮助都将不胜感激 列是购物者id和sku,我需要将购物者id放在一列中,左侧的sku用逗号分隔 以下是我需要进行数据透视的查询: SELECT [a].[shopper_id] , [a].[sku] FROM ( SELECT [s].[shopper_id] , [si].
SELECT
[a].[shopper_id]
, [a].[sku]
FROM
( SELECT
[s].[shopper_id]
, [si].[sku]
FROM
[dbo].[sales] [s]
INNER JOIN [dbo].[sales_item] [si]
ON
[si].[order_id] = [s].[order_id]
WHERE
[si].[sku] IS NOT NULL
AND [si].[sku] NOT LIKE ''
ORDER BY
[si].[sku]
) [a];
以下是一些数据:
0ZF57CFXCBTF4G2X68B9DKH1C9DNUN37 BKAL00-30013
72YHJYU0QFMSNC61RG42TGTD53FDUM37 BKAL00-30013
4U3H3V4LX193NLY4C0FXJJD2SSS3BT37 BKAL00-30013
7UQBXPWB0CSXNYYNB1R360BJHKCQ6F47 BKAL00-30013
6WTCMTS6551PNGQRKDZRZ6NLRMB011P6 BKAL00-30013
784HKB96M5SN4VBU18U0Y3WH037F2147 BKAL0011674X
784HKB96M5SN4VBU18U0Y3WH037F2147 BKAL0011675X
TDK8YDJQMTHL48GNGVXGS6RBUCHPKK37 BKAL0020413X
R472477HL8C8N2GBP9TG6F1K7N5JV1P6 BKAL0024498
ZSM7F5FNYBXDNZU3KZTV71PY58K8KQ17 BKAL0024498
YPF1NDD5Z35V4GGMXXPCWRUF56NTKYB6 BKAL0024498
CGNYSNFF0M0WNLU2FW6NRKJ7JQL6MBW5 BKAL0025397
Y7J85S5M29LG45Y69H2QDJFX5JB17D47 BKAL0025397
预期产出应为:
shopper id sku1 sku2 sku3 so on...
00000148-4CDD-46C1-BD86-DF001A MN0042258 MN0073222 MN0044842
so on...
非常感谢。您说过希望使用逗号分隔的列表。你可以这样做:
declare @table table (shopper_id nvarchar(256), sku nvarchar(256))
insert into @table
values
('0ZF57CFXCBTF4G2X68B9DKH1C9DNUN37','BKAL00-30013'),
('72YHJYU0QFMSNC61RG42TGTD53FDUM37','BKAL00-30013'),
('4U3H3V4LX193NLY4C0FXJJD2SSS3BT37','BKAL00-30013'),
('7UQBXPWB0CSXNYYNB1R360BJHKCQ6F47','BKAL00-30013'),
('6WTCMTS6551PNGQRKDZRZ6NLRMB011P6','BKAL00-30013'),
('784HKB96M5SN4VBU18U0Y3WH037F2147','BKAL0011674X'),
('784HKB96M5SN4VBU18U0Y3WH037F2147','BKAL0011675X'),
('TDK8YDJQMTHL48GNGVXGS6RBUCHPKK37','BKAL0020413X'),
('R472477HL8C8N2GBP9TG6F1K7N5JV1P6','BKAL0024498'),
('ZSM7F5FNYBXDNZU3KZTV71PY58K8KQ17','BKAL0024498'),
('YPF1NDD5Z35V4GGMXXPCWRUF56NTKYB6','BKAL0024498'),
('CGNYSNFF0M0WNLU2FW6NRKJ7JQL6MBW5','BKAL0025397'),
('Y7J85S5M29LG45Y69H2QDJFX5JB17D47','BKAL0025397')
select distinct
shopper_id,
skuList = STUFF((
SELECT ',' + md.sku
FROM @table md
WHERE m.shopper_id = md.shopper_id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from
@table m
基于上次编辑进行编辑
预期输出是?我添加了预期输出示例现在你不想要逗号分隔的列表,而是由列名组成?使用动态数据透视添加了另一个答案谢谢,我正在尝试使用select查询在临时表中插入值,当我这样做时,我收到一条错误消息:选择列表中的元素数超过了允许的最大4096个元素数。-你知道为什么吗?不知道。不知道为什么。您应该能够从[s].[shopper\u id],[si].[sku]从[dbo].[sales][s]内部连接[dbo].[sales\u item][si]在[si].[order\u id]=[s].[order\u id]的[si].[sku]中选择[a].[shopper\u id],[s]到表中不为NULL,[si].[sku]与[si].[sku][a]的顺序不同,但这将是另一个关于堆栈溢出的问题。是的,这正是我想做的,但不正常。您的外部选择是毫无意义的。只需使用括号中的内部查询
if object_id('tempdb..#Table') is not null drop table #Table
create table #Table (shopper_id nvarchar(256), sku nvarchar(256))
insert into #Table
values
('0ZF57CFXCBTF4G2X68B9DKH1C9DNUN37','BKAL00-30013'),
('72YHJYU0QFMSNC61RG42TGTD53FDUM37','BKAL00-30013'),
('4U3H3V4LX193NLY4C0FXJJD2SSS3BT37','BKAL00-30013'),
('7UQBXPWB0CSXNYYNB1R360BJHKCQ6F47','BKAL00-30013'),
('6WTCMTS6551PNGQRKDZRZ6NLRMB011P6','BKAL00-30013'),
('784HKB96M5SN4VBU18U0Y3WH037F2147','BKAL0011674X'),
('784HKB96M5SN4VBU18U0Y3WH037F2147','BKAL0011675X'),
('TDK8YDJQMTHL48GNGVXGS6RBUCHPKK37','BKAL0020413X'),
('R472477HL8C8N2GBP9TG6F1K7N5JV1P6','BKAL0024498'),
('ZSM7F5FNYBXDNZU3KZTV71PY58K8KQ17','BKAL0024498'),
('YPF1NDD5Z35V4GGMXXPCWRUF56NTKYB6','BKAL0024498'),
('CGNYSNFF0M0WNLU2FW6NRKJ7JQL6MBW5','BKAL0025397'),
('Y7J85S5M29LG45Y69H2QDJFX5JB17D47','BKAL0025397')
if object_id('tempdb..#StagingTable') is not null drop table #StagingTable
select
*
,'sku'+ cast(row_number() over (partition by shopper_id order by (select null)) as varchar(64)) as RN
into #StagingTable
from #Table
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(RN)
FROM (SELECT DISTINCT RN FROM #StagingTable) AS Cname
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
N'SELECT shopper_id, ' + @ColumnName + '
FROM #StagingTable
PIVOT(min(sku)
FOR RN IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery