添加列并返回合并数据

adding columns and returning consolidated data

有人可以帮我写 SQL 查询到 calculate/display 下面的例子:

table - 发货

- 产品代码/数量/唯一代码

          sku a   |    5   | nnnn
          sku a   |    5   | nn
          sku a   |    10  | (blank)
          sku b   |    2   | nnn
          sku c   |    2   | (blank)
          sku c   |    2   | (blank)

我正在寻找这样的输出:

- 产品代码/数量/唯一代码

          sku a   |    20   | nnnn, nn
          sku b   |    2    | nnn
          sku c   |    4    | (blank)

LISTAGG 是你的救星。

SELECT 
  product_code, 
  SUM(qty) as total_qty, 
  LISTAGG(unique_code, ',') WITHIN GROUP (ORDER BY unique_code)
FROM
  shipment
GROUP BY
  product_code

编辑: 将答案放在这里以获得更好的代码输出:

您的 listagg 字段前面有 "i.",但您没有 table 别名。此外,您需要将 pallet_id 添加到分组依据。试试这个

SELECT 
  reference_id, 
  pallet_id, 
  SUM(update_qty) as total_qty, 
  LISTAGG(user_def_type_1, ',') WITHIN GROUP (ORDER BY user_def_type_1)
FROM
  inventory_transaction 
WHERE
  code = 'Shipment' AND site_id = 'GBRUN2A' AND client_id = '021' AND dstamp >= current_date -21 
GROUP BY 
  reference_id, pallet_id

如果仍然出现错误,能否确认您使用的是 Oracle?我很确定这是 Oracle 专用的函数。

是 - 使用 Oracle Sql 开发人员版本 4.0.1.14

预计到达时间:您能否确认您使用的是哪个版本的 Oracle 数据库 运行。 Listagg 仅适用于 Oracle 12c 和 Oracle 11g 第 2 版。如果您是 运行 以前的版本,请查看 here 以了解一些替代想法。

如果您使用的 Oracle 版本不支持 LISTAGG()(例如 Oracle 10g),那么您可以做一些事情。最简单的方法是使用未记录的 WM_CONCAT() 函数(returns 可以是 VARCHARCLOB,具体取决于版本):

SELECT reference_id, pallet_id, SUM(update_qty) as total qty
     , WM_CONCAT(user_def_type_1)
  FROM inventory_transaction
 GROUP BY reference_id

使用 WM_CONCAT() 的一个困难是串联的结果不会排序。您也无法选择分隔符。另一种选择,可能是更好的选择,是使用 XMLAGG() (这实际上是一个记录的函数):

SELECT reference_id, pallet_id, SUM(update_qty) as total qty
     , XMLAGG(XMLELEMENT(e, user_def_type_1 || ',')).EXTRACT('//text()')
  FROM inventory_transaction
 GROUP BY reference_id;

这里你可以选择分隔符, XMLAGG()支持ORDER BY子句:

SELECT reference_id, pallet_id, SUM(update_qty) as total qty
     , XMLAGG(XMLELEMENT(e, user_def_type_1 || ',') ORDER BY user_def_type_1).EXTRACT('//text()')
  FROM inventory_transaction
 GROUP BY reference_id;

您可以在 this Stack Overflow question 找到其他选项。