sql - 利斯塔格 : group within group

标签 sql oracle

让我从数据开始,以便更好地描述我的需求。我有一个名为 SUPERMARKET 的表,其中包含以下字段:

Field 1: StoreID
Field 2: ProductCategory
Field 3: ProductID

数据将如下所示:

1, Fruit, Banana
1, Fruit, PineApple
1, Fruit, Strawberry
1, Beverage, Milk
1, Beverage, Chocolate Milk
1, Beverage, Apple Juice
1, Vegetable, beet
2, Vegetable, beet
2, Vegetable, onion
2, Vegetable, Kyle

我想要这样的 View :

1, Fruit:(Banana, PineApple, Strawberry), Beverage:(Milk, Chocolate Milk, Apple Juice), Vegetable: (beet)
2, Vegetable:(beet, onion, kyle)

Oracle 是否有办法显示我正在寻找的信息,如上所述?我试过:

SELECT "StoreID", LISTAGG("ProductCategory",',') WITHIN GROUP (ORDER BY "ProductCategory") "ProductCategories" FROM SUPERMARKET GROUP BY "StoreID"

但这一个只列出了:

1, "Fruit,Beverage,Vegetable"
2, "Vegetable"

或者如果我使用 ProductID 而不是 ProductCategory,那么我会得到一个随机显示的产品列表,而不是按类别分组

SELECT "StoreID", LISTAGG("ProductID",',') WITHIN GROUP (ORDER BY "ProductID") "Products" FROM SUPERMARKET GROUP BY "StoreID"

有没有人知道如何解决这个问题?请帮忙。

有关 View 的更新和问题:

在我尝试将完全相同的工作 sql 放入 View 之前,每个人建议的 sql 都非常有效。出于某种原因,Oracle 编译器不喜欢它并抛出错误:

Error(s) parsing SQL:
Unexpected token near *!* in the following:
|| ')', ', ') WITHIN *!*GROUP (
Unexpected token near *!* in the following:
|| ')', ', ') WITHIN GROUP *!*(
Missing expression near *!* in the following:
|| ')', ', ') WITHIN GROUP (
*!*ORDER BY ProductCategory) AS ProductsAndCategories

有人知道为什么吗?由于它与我原来的问题有关,我想我会把它放在同一个问题中,以便将来引用。

enter image description here

来自 Gordon 的建议:

这实际上是 SQL Developer GUI 的错误。绕过这个问题 ->Create view using statement 。

最佳答案

做两层聚合:

SELECT storeId,
       LISTAGG(ProductCategory || ':' || '(' || ProductIds || ')', ', ')
            WITHIN GROUP (ORDER BY ProductCategory) as ProductsAndCategories
FROM (SELECT StoreId, ProductCategory,
             LISTAGG(ProductId, ',') WITHIN GROUP (ORDER BY ProductId) as ProductIds
      FROM SUPERMARKET
      GROUP BY StoreId, ProductCategory
     ) s
GROUP BY StoreId;

关于sql - 利斯塔格 : group within group,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128850/

相关文章:

sql - 有没有办法使用 SQL Server 2012 查找 View 中引用的所有无效列?

mysql - 将目录中的数据同步到数据库的实用方法是什么?

mysql - 在 MySql 中快速更新数千条记录

oracle - 如何在 Hibernate 中使用 Oracle 查询提示

oracle - 创建返回 XML 和 JSON 的 Oracle APEX Restful 服务

Mysql 数据范围显示奇怪的结果

mysql - 在更新期间只为我的查询锁定表?

java - 从 quartz 作业读/写数据库 - 事务不起作用

sql - 如何用另一个表中的另一行替换表中的一行?

sql - 将一个选择结果除以另一个选择结果