有人可以帮我编写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)
答案 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()
函数(根据版本返回VARCHAR
或CLOB
):
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找到其他选项。