添加列并返回合并数据

时间:2015-01-19 15:14:57

标签: sql oracle

有人可以帮我编写SQL查询来计算/显示以下示例:

表格 - 货件

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

          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)

2 个答案:

答案 0 :(得分:5)

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中的字段前面,但是没有表别名。此外,您需要将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 Developer版本4.0.1.14

ETA:您能否确定您正在运行的Oracle数据库版本? Listagg仅适用于Oracle 12c和Oracle 11g第2版。如果您运行的是以前的版本,请查看here以了解其他一些想法。

答案 1 :(得分:0)

如果您使用的是不支持LISTAGG()的Oracle版本(例如,Oracle 10g),那么您可以执行以下操作。最简单的方法是使用未记录的WM_CONCAT()函数(根据版本返回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找到其他选项。