【问题标题】:Show multiple row results in SQL Server 2005 as a single row在 SQL Server 2005 中将多行结果显示为单行
【发布时间】:2017-10-07 18:22:57
【问题描述】:

我需要在 SQL Server 2005 中进行查询以将多行的结果合并到一行中

我所掌握的与服装尺码相关的数据如下:

#   Item No.    Garment SKU In Stock    
1   CUR211NA-L  CUR211NA    0.00    
2   CUR211NA-LB CUR211NA    10.00   
3   CUR211NA-M  CUR211NA    0.00    
4   CUR211NA-MB CUR211NA    3.00    
5   CUR211NA-S  CUR211NA    0.00    
6   CUR211NA-SB CUR211NA    -9.00   
7   CUR211NA-XL CUR211NA    0.00    
8   CUR211NA-XXL    CUR211NA    0.00    
9   CUR211NA-YTH    CUR211NA    7.00    

我需要在列中显示单个 SKU 代码行,其大小如下:

    SB  MB  LB  YTH S   M   L   XL  XXL
CUR211NA    -9  3   10  7   0   0   0   0   0

到目前为止,我所拥有的是正确显示数量但将每个项目放在单独的行中

SELECT distinct T0.[U_GarmentSKU], T0.[U_Garment_Title],

(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('47900')  and t0.itemcode=t1.itemcode) 'SB',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('39600')  and t0.itemcode=t1.itemcode) as 'MB',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('38500')  and t0.itemcode=t1.itemcode) as 'LB',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('50100')  and t0.itemcode=t1.itemcode) as 'YTH',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('47700')  and t0.itemcode=t1.itemcode) as 'S',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('39400')  and t0.itemcode=t1.itemcode) as 'M',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('38300')  and t0.itemcode=t1.itemcode) as 'L',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('49200','48700')  and t0.itemcode=t1.itemcode) as 'XL',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('49700','49300')  and t0.itemcode=t1.itemcode) as 'XXL',
(select  T0.[OnHand]  from oitm t1 where  T0.[U_GarmentSize] IN ('49800')  and t0.itemcode=t1.itemcode) as 'XXXL'

FROM OITM T0 WHERE T0.[U_GarmentSKU] like 'SUR%' and  T0.[U_StkStat] = 'G'

【问题讨论】:

    标签: sql sql-server-2005 pivot


    【解决方案1】:

    不要使用子查询。要么使用pivot(好吧,不在 SQL Server 2005 中)或条件聚合:

    SELECT T0.[U_GarmentSKU], T0.[U_Garment_Title],
           SUM(CASE WHEN T0.[U_GarmentSize] IN ('47900') THEN T0.[OnHand] ELSE 0
               END) as SB,
           . . .
    FROM OITM T0
    WHERE T0.[U_GarmentSKU] like 'SUR%' and  T0.[U_StkStat] = 'G'
    GROUP BY T0.[U_GarmentSKU], T0.[U_Garment_Title];
    

    【讨论】:

      【解决方案2】:

      与 Gordon Linoff 的答案相同的条件聚合,只是针对问题中的所有列展开:

      select 
          t.[U_GarmentSKU]
        , t.[U_Garment_Title]
        , [SB]   = sum(case when t.[U_GarmentSize] in ('47900')         then t.[OnHand] else 0 end)
        , [MB]   = sum(case when t.[U_GarmentSize] in ('39600')         then t.[OnHand] else 0 end)
        , [LB]   = sum(case when t.[U_GarmentSize] in ('38500')         then t.[OnHand] else 0 end)
        , [YTH]  = sum(case when t.[U_GarmentSize] in ('50100')         then t.[OnHand] else 0 end)
        , [S]    = sum(case when t.[U_GarmentSize] in ('47700')         then t.[OnHand] else 0 end)
        , [M]    = sum(case when t.[U_GarmentSize] in ('39400')         then t.[OnHand] else 0 end)
        , [L]    = sum(case when t.[U_GarmentSize] in ('38300')         then t.[OnHand] else 0 end)
        , [XL]   = sum(case when t.[U_GarmentSize] in ('49200','48700') then t.[OnHand] else 0 end)
        , [XXL]  = sum(case when t.[U_GarmentSize] in ('49700','49300') then t.[OnHand] else 0 end)
        , [XXXL] = sum(case when t.[U_GarmentSize] in ('49800')         then t.[OnHand] else 0 end)
      from oitm t
      where t.[U_GarmentSKU] like 'SUR%' 
        and t.[U_StkStat] = 'G'
      group by t.[U_GarmentSKU], t.[U_Garment_Title]
      

      【讨论】:

      • 非常感谢你们!两个很好的答案,都完全符合我的需要。
      猜你喜欢
      • 2013-03-23
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多