Sql 如何在两列上使用pivot函数

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].

我试图理解如何使用SQLServer的PIVOT函数来透视2列。我所看到的大多数示例都使用了两个以上的列,我不知道在使用较少的列时如何应用

任何帮助都将不胜感激

列是购物者id和sku,我需要将购物者id放在一列中,左侧的sku用逗号分隔

以下是我需要进行数据透视的查询:

    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