如何将多行转换为一行以获得总和数量

时间:2019-05-26 21:56:33

标签: sql sql-server tsql

我将需要将多行合并为一行以获得总数。我的桌子看起来像这样

Sublot_Number Lot_Number Qty Pallet_ID
------------- ---------- --- ---------
 S1             L1        1    P1
 S2             L2        1    P1
 S3             L3        3    P1

我的结果应如下所示

Sublot_Number  Lot_Num1 Lot_Num2 Lot_Num3 Qty_Sum Pallet_ID 
-------------  -------- -------- -------- ------- ---------
Random Number    L1       L2        L3      5        P1

我尝试过Pivot,但是没有运气。同一托盘可能会使用3个以上的子批次,但我只会选择三个子批次作为Lot_Num1,Lot_Num2和Lot_Num3

在这种情况下将是什么解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合(或pivot),但键为row_number()

select rand(checksum(newid())) as sublot_number,
       pallet_id,
       max(case when seqnum = 1 then lot_number end) as lot_num1,
       max(case when seqnum = 2 then lot_number end) as lot_num2,
       max(case when seqnum = 3 then lot_number end) as lot_num3,
       sum(qty)
from (select t.*,
             row_number() over (partition by pallet_id order by (select null)) as seqnum
      from t
     ) t
group by pallet_id;

如果您希望数量的总和仅为三个所选批次的数量,则将where seqnum <= 3添加到外部查询中。

如果您具有某种优先级(例如最大数量),则将其用于order by