【问题标题】:Oracle SQL - Concat + Listagg + Count does not work togetherOracle SQL - Concat + Listagg + Count 不能一起工作
【发布时间】:2022-08-18 19:35:47
【问题描述】:
我有一张桌子 \'allorders\' ,看起来像这样:
| Order_Nr |
Items |
| O100 |
5X1 |
| O100 |
5X1 |
| O100 |
7B3 |
| O101 |
3A2 |
| O101 |
3A2 |
我想从一个订单中获取所有项目作为一个字符串+订单号,应该如下所示:
| Order_Nr |
OrderOverview |
| O100 |
2 x 5X1 1 x 7B3 |
我的 SQL 查询看起来像这样:
SELECT Order_Nr, LISTAGG(CONCAT(CONCAT(COUNT(Items), \' x \'), Items), \' \') WITHIN GROUP(ORDER by Items) as OrderOverview
FROM allorders
WHERE Order_Nr = \'O100\'
ORDER BY Order_Nr;
我正在使用 Oracle 11g,我收到以下错误消息:
ORA-00937: 单组没有组功能
00937. 00000 - “不是单组群功能”
*原因:
*行动:
如果我没有在 SQL Query 中选择 Order_Nr,它可以工作,但我希望在结果中看到它,以获得我想在未来创建的可能视图。
我错过了什么?我的想法一般都行不通吗?
我希望我已经处理好数据,但如果信息丢失,请告诉我。
谢谢,
标签:
sql
oracle
oracle11g
sql-order-by
listagg
【解决方案1】:
你想使用GROUP BY 两次;首先,为每个项目和订单配对找到COUNT,然后,将字符串与LISTAGG 连接起来:
SELECT order_nr,
LISTAGG(counted_items, ' ') WITHIN GROUP (ORDER BY items)
AS OrderOverview
FROM (
SELECT order_nr,
items,
COUNT(*) || ' x ' || Items AS counted_items
FROM allorders
WHERE Order_Nr = 'O100'
GROUP BY
order_nr,
items
)
GROUP BY
order_nr
其中,对于样本数据:
CREATE TABLE allorders (Order_Nr, Items) AS
SELECT 'O100', '5X1' FROM DUAL UNION ALL
SELECT 'O100', '5X1' FROM DUAL UNION ALL
SELECT 'O100', '7B3' FROM DUAL UNION ALL
SELECT 'O101', '3A2' FROM DUAL UNION ALL
SELECT 'O101', '3A2' FROM DUAL;
输出:
| ORDER_NR |
ORDEROVERVIEW |
| O100 |
2 x 5X1 1 x 7B3 |
db<>小提琴here