【问题标题】:SQL - group by - merge a column's values into one row?SQL - 分组 - 将一列的值合并到一行?
【发布时间】:2018-01-20 15:10:53
【问题描述】:

(在SSMS2016工作)我有一个如下表:

| ORDER_NUMBER | ITEM_CAT| ORDER_QTY | UNALLOCATED|
|--------------|---------|-----------|------------|
|  1           | FLAT    | 2         | 1          |
|  1           | HANG    | 1         | 1          |
|  1           | SHOE    | 2         | 1          |
|  2           | FLAT    | 1         | 1          |
|  2           | FLAT    | 1         | 1          |
|  3           | SHOE    | 1         | 1          |
|  3           | SHOE    | 1         | 1          |
|  3           | SHOE    | 1         | 1          |
|  4           | FLAT    | 1         | 1          |
|  4           | SHOE    | 1         | 1          |
|  4           | FLAT    | 1         | 1          |
|  4           | SHOE    | 1         | 1          |

如果我这样做了

SELECT ORDER_NUMBER, ITEM_CAT, SUM(ORDER_QTY) AS 'ORDER_QTY', SUM(UNALLOCATED) AS 'UNALLOCATED' 
FROM TABLEA 
GROUP BY ORDER_NUMBER, ITEM_CAT

我得到以下信息:

| ORDER_NUMBER | ITEM_CAT| ORDER_QTY | UNALLOCATED|
|--------------|---------|-----------|------------|
|  1           | FLAT    | 2         | 1          |
|  1           | HANG    | 1         | 1          |
|  1           | SHOE    | 2         | 1          |
|  2           | FLAT    | 2         | 2          |
|  3           | SHOE    | 3         | 3          |
|  4           | FLAT    | 2         | 2          |
|  4           | SHOE    | 2         | 2          |

理想情况下,我希望为每个 ORDER_NUMBER 获取一行,并在同一行中列出唯一的 ITEM_CAT 值,例如:

| ORDER_NUMBER | ITEM_CAT             | ORDER_QTY | UNALLOCATED|
|--------------|----------------------|-----------|------------|
|  1           | FLAT / HANG / SHOE   | 5         | 3          |
|  2           | FLAT                 | 2         | 2          |
|  3           | SHOE                 | 3         | 3          |
|  4           | FLAT / SHOE          | 4         | 4          |

这很容易实现吗?

谢谢。

【问题讨论】:

  • 虽然这可能是某些问题的重复,但它不是建议问题的重复。自 SQL Server 2005 以来,SQL Server 的功能发生了变化,导致该解决方案已过时。

标签: sql sql-server sql-server-2016 ssms-2016


【解决方案1】:

如果您使用的是 SQL Server 2016,则可以使用string_agg()

SELECT ORDER_NUMBER,
       STRING_AGG(ITEM_CAT, ' / ') as ITEM_CATS,
       SUM(ORDER_QTY) AS ORDER_QTY, 
       SUM(UNALLOCATED) AS UNALLOCATED
FROM (SELECT ORDER_NUMBER, ITEM_CAT, SUM(ORDER_QTY) AS ORDER_QTY,
             SUM(UNALLOCATED) AS UNALLOCATED
      FROM TABLEA
      GROUP BY ORDER_NUMBER, ITEM_CAT
     ) a
GROUP BY ORDER_NUMBER;

【讨论】:

  • 非常感谢。我认为 string_agg() 是在 2017 年添加的(或者可能是 2016 年的更新版本),所以很遗憾我不能使用它。然而,它确实让我找到了“STUFF...FOR XML PATH”,经过一番反复试验,我设法得到了我需要的东西。
猜你喜欢
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2014-02-07
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多