在sql中将多个值相同的id转换为单行

时间:2018-01-29 12:03:09

标签: sql sql-server-2012 string-aggregation

这是我的表格,我希望以一行格式添加值,我的代码是

OrderDate OrderID ItemNo PaymentType        Cash    Nets    Visa    AMEX MasterCard Voucher Remarks ReciptNo

2018-01-27  809   40149  Mix Payment Type   NULL    NULL    NULL    NULL    NULL    55.00   NULL    NULL
2018-01-27  809   40149  Mix Payment Type   NULL    NULL    NULL    NULL    10.00   NULL    NULL    ABC123
2018-01-27  809   40149  Mix Payment Type   NULL    NULL    NULL    4.00    NULL    NULL    NULL    PQE789
2018-01-27  809   40149  Mix Payment Type   NULL    NULL    10.00   NULL    NULL    NULL    NULL    123456
2018-01-27  809   40149  Mix Payment Type   20.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL

我想要o / p喜欢

OrderDate   OrderID     ItemNo       PaymentType        Cash    Nets    Visa    AMEX    MasterCard  Voucher Remarks    ReciptNo
2018-01-27  809         40149        Mix Payment Type   20.00   NULL    10.00   4.00    10.00       55.00   NULL    ABC123,PQR789,123456

我应该在sql查询中做些什么

3 个答案:

答案 0 :(得分:3)

尝试这样的事情:

SELECT OrderDate,
       OrderID,
       ItemNo,
       PaymentType,
       MAX(Cash),
       MAX(Nets),
       MAX(Visa),
       MAX(AMEX),
       MAX(MasterCard),
       MAX(Voucher),
       MAX(Remarks),
       STUFF((
            SELECT ', ' + ISNULL(R2.ReciptNo,'')
            FROM TableName t2
            WHERE t1.OrderID= t2.OrderID
            FOR XML PATH ('')), 1, 2, '') AS ReciptNos
FROM TableName t1
GROUP BY OrderDate,OrderID,ItemNo,PaymentType

答案 1 :(得分:1)

由于您只想要一个具有相同值的列,您可以按方法使用组:

SELECT
  OrderDate, OrderID, ItemNo, PaymentType,
  MAX(cash), MAX(nets), MAX(Visa), MAX(AMEX), MAX(MasterCard), MAX(Voucher),
  STRING_AGG(Remarks, ', '), STRING_AGG(ReciptNo, ', ')
FROM myTable
GROUP BY OrderDate, OrderID, ItemNo, PaymentType

这显然只有在没有两行都有例如Cash条目时才有效。

PS:玩SQLFiddle来玩。

答案 2 :(得分:0)

你可以尝试

  1. 将此组合在ItemNo上以获得单行
  2. 使用MAX(现金)等获取唯一的非空值