添加列并返回合并数据
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 可以是 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 找到其他选项。
有人可以帮我写 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 可以是 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 找到其他选项。