【问题标题】:SQL join results in columnsSQL 连接结果在列中
【发布时间】:2020-06-19 11:43:47
【问题描述】:

我有一张佩戴者表格和一张SKU表格。一个 Wearer 可以有多个 SKU,当它们匹配时,我想看到那个结果。传统上,我会显示这样的结果:

WEARER      SKU
------------------
Wearer 1    SKU 38    
Wearer 2    SKU 47
Wearer 2    SKU 75
Wearer 3    SKU 38
Wearer 7    SKU 47
Wearer 7    SKU 99

但是,请求此查询的人希望看到它是这样的:

WEARER      SKU 1     SKU 2    SKU 3    ...
-------------------------------------------
Wearer 1    SKU 38
Wearer 2    SKU 47    SKU 75
Wearer 3    SKU 38
Wearer 7    SKU 47    SKU 99

因此,对于与佩戴者匹配的每个 SKU,为该 SKU 创建一个列。在 T-SQL (SQL Server) 中进行这种连接方式的正确方法是什么?

一些信息:

  • 分配给佩戴者的 SKU 不会超过 10 个。

【问题讨论】:

  • 你知道SKU的最大数量吗? SQL 查询的列数是固定的,如果不知道,则需要使用动态 SQL。
  • 我从未见过超过 10 个。我将把这个添加到我的问题中。
  • 您是否考虑过使用枢轴完成您的连接?你能显示你有加入的脚本吗?
  • 您现在可能不需要这个,但我绝对建议您检查一下 - sqlrelease.com/dynamic-pivot-query-in-sql-server

标签: sql-server database tsql join


【解决方案1】:

如果你确定它不会超过 10,那么你可以在这里使用条件聚合:

;with tableA as
(select 'Wearer 1' as Wearer,'SKU 38' as SKU union
select 'Wearer 2','SKU 47' union
select 'Wearer 2','SKU 75' union
select 'Wearer 3','SKU 38' union
select 'Wearer 7','SKU 47' union
select 'Wearer 7','SKU 99')

select x.Wearer,
       MAX(CASE WHEN rownum1=1 then SKU end) as SKU_1,
       MAX(CASE WHEN rownum1=2 then SKU end) as SKU_2,
       MAX(CASE WHEN rownum1=3 then SKU end) as SKU_3,
       MAX(CASE WHEN rownum1=4 then SKU end) as SKU_4,
       MAX(CASE WHEN rownum1=5 then SKU end) as SKU_5,
       MAX(CASE WHEN rownum1=6 then SKU end) as SKU_6,
       MAX(CASE WHEN rownum1=7 then SKU end) as SKU_7,
       MAX(CASE WHEN rownum1=8 then SKU end) as SKU_8,
       MAX(CASE WHEN rownum1=9 then SKU end) as SKU_9,
       MAX(CASE WHEN rownum1=10 then SKU end) as SKU_10
from
(select a.*,
       row_number() over (partition by Wearer order by SKU) as rownum1
from tableA a) x
Group by x.Wearer

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    以防万一您想尝试PIVOT 方法。

    示例

    Select *
     From (
            Select WEARER
                  ,SKU
                  ,Col = concat('SKU ',row_number() over (partition by wearer order by SKU) )
             from YourTable
          ) src
     Pivot (max(SKU) for Col in ([SKU 1],[SKU 2],[SKU 3],[SKU 4],[SKU 5] ) ) pvt
    

    退货

    WEARER      SKU 1   SKU 2   SKU 3   SKU 4   SKU 5
    Wearer 1    SKU 38  NULL    NULL    NULL    NULL
    Wearer 2    SKU 47  SKU 75  NULL    NULL    NULL
    Wearer 3    SKU 38  NULL    NULL    NULL    NULL
    Wearer 7    SKU 47  SKU 99  NULL    NULL    NULL
    

    编辑 - 如果您不想要 NULL 值

    Select WEARER
          ,[SKU 1] = concat('',[1])
          ,[SKU 2] = concat('',[2])
          ,[SKU 3] = concat('',[3])
          ,[SKU 4] = concat('',[4])
          ,[SKU 5] = concat('',[5])
     From (
            Select WEARER
                  ,SKU
                  ,Col = row_number() over (partition by wearer order by SKU) 
             from YourTable
          ) src
     Pivot (max(SKU) for Col in ([1],[2],[3],[4],[5] ) ) pvt
    

    【讨论】:

      猜你喜欢
      • 2014-10-17
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2012-08-15
      • 2010-11-23
      相关资源
      最近更新 更多