如何在Oracle的WHERE子句中使用COUNT

问题描述 投票:0回答:2

我正在使用oracle中的数据库HR和OE,我需要进行一个查询,显示:客户的姓名和名字,订单号以及为客户购买的产品列表有超过2个订单。

在OE中是我正在使用的所有表

这是我的查询

SELECT cc.cust_first_name, cc.cust_last_name, oo.order_id, pi.product_name FROM
    customers cc INNER JOIN orders oo ON cc.customer_id = oo.customer_id INNER JOIN
    order_items oi ON oo.order_id = oi.order_id INNER JOIN product_information pi ON
    oi.product_id = pi.product_id
    GROUP BY cc.cust_first_name, cc.cust_last_name, oo.order_id, pi.product_name
    HAVING COUNT(oo.order_id) > 2;

这是数据库enter image description here

sql oracle group-by having
2个回答
0
投票

使用子查询,因为对于组过滤器,您必须使用您在查询中使用的那个,但如果您想要那个计数过滤器的位置,那么您使用子查询或cte

    select * from
     (
     SELECT cc.cust_first_name, cc.cust_last_name, oo.order_id, 
    pi.product_name,COUNT(oo.order_id) as cnt
    FROM
    customers cc INNER JOIN orders oo ON cc.customer_id = oo.customer_id INNER JOIN
    order_items oi ON oo.order_id = oi.order_id INNER JOIN product_information pi ON
    oi.product_id = pi.product_id
    GROUP BY cc.cust_first_name, cc.cust_last_name, oo.order_id, pi.product_name
    ) a where a.cnt>2

0
投票

您可以使用聚合将信息组合在一起:

SELECT cc.cust_first_name, cc.cust_last_name,
       COUNT(DISTINCT oo.order_id) as num_orders,
       LISTAGG(pi.product_name) as products
FROM customers cc INNER JOIN
     orders oo
     ON cc.customer_id = oo.customer_id INNER JOIN
     order_items oi
     ON oo.order_id = oi.order_id INNER JOIN
     product_information pi
     ON oi.product_id = pi.product_id
GROUP BY cc.cust_first_name, cc.cust_last_name
HAVING COUNT(DISTINCT oo.order_id) > 2;
© www.soinside.com 2019 - 2024. All rights reserved.