【问题标题】:How to use pivot function on 2 columns如何在 2 列上使用数据透视函数
【发布时间】:2017-06-23 18:22:44
【问题描述】:

我试图了解如何使用 SQL Server 的 PIVOT 函数来透视 2 列。我见过的大部分例子,都使用了2列以上,不知道在使用较少列的情况下如何应用。

任何帮助将不胜感激。

列是 shopper_id 和 sku,我需要将 shopper_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...

非常感谢。

【问题讨论】:

  • 预期的输出是?
  • 我添加了预期的输出示例
  • 现在您不想用逗号分隔列表,而是组成列名?
  • 使用动态枢轴添加了另一个答案

标签: sql sql-server-2012 pivot-table


【解决方案1】:

您说您想要一个逗号分隔的列表。你会这样做:

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

编辑基于您上次的编辑

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

【讨论】:

  • 谢谢,我正在尝试使用我的选择查询在临时表中插入值,当我这样做时,我收到一条错误消息:选择列表中的元素数量超过最大允许数量 4096 个元素。 - 你知道为什么吗?
  • 不。不知道为什么。您应该能够执行类似SELECT [a].[shopper_id] , [a].[sku] into #Table 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] 之类的操作,但这将是 Stack Overflow 上要问的另一个问题。
  • 是的,这正是我想要做的,但没有工作
  • 你的外部选择毫无意义。只需使用括号中的内部查询
猜你喜欢
  • 2014-03-25
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多