繁体   English   中英

Oracle SQL 语法问题 - 如何正确组合 2 个查询而不会出错

[英]Oracle SQL syntax issue - how do I correctly combine 2 queries without error

所以我有两个疑问。 第一个返回网格部分的列表,以及该网格部分的订单数:

SELECT DISTINCT customer.grid_section, count(orders.order_pk)
FROM customer INNER JOIN orders
    ON customer.customer_pk = orders.customer_fk 
GROUP BY customer.grid_section;

这工作正常并输出(code_output_1):

code_output_1

第二个查询输出每个网格部分的平均订单数量:

SELECT ROUND(
        (COUNT(DISTINCT orders.order_pk)) / 
        (COUNT(DISTINCT customer.grid_section))) as avg
FROM customer, orders;

同样,这工作正常并输出(code_output_2):

code_output_2

我想要实现的是一个输出查询 1 内容的查询,其中主查询 1 中的 count(orders.order_pk) 列等于第二个查询中计算的平均值。

我尝试了多种方法,包括:

SELECT DISTINCT customer.grid_section, count(orders.order_pk)
FROM customer INNER JOIN orders
    ON customer.customer_pk = orders.customer_fk
WHERE count(orders.order_pk)
    (SELECT ROUND(
        (COUNT(DISTINCT orders.order_pk)) / 
        (COUNT(DISTINCT customer.grid_section))) as avg
    FROM customer, orders   
    )
GROUP BY customer.grid_section;

这给出了一个错误(error_1):

***ORA-00934: group function is not allowed here
00934. 00000 -  "group function is not allowed here"
*Cause:    
*Action:
Error at Line: 4 Column: 7***

也:

SELECT DISTINCT customer.grid_section, 
    COUNT(orders.order_pk) AS "tot_orders"
FROM customer, orders, (SELECT ROUND(
        (COUNT(DISTINCT orders.order_pk)) / 
        (COUNT(DISTINCT customer.grid_section))) AS "avg_orders"
        FROM customer, orders) subq1
WHERE "tot_orders" = "avg_orders"

这给了我另一个错误(error_2):

*ORA-00904: "tot_orders": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 7 Column: 7*

如果有人可以就我做错了什么或如何实现最终结果提出任何建议,我将不胜感激。

谢谢。

我不太清楚第二个查询的意图,但我怀疑您正在尝试过滤第一个结果集(每个网格部分的订单数)以查找其计数与计数的(四舍五入)平均值相匹配的记录。

如果是这样,您可以使用窗口函数:

SELECT *
FROM (
    SELECT c.grid_section, COUNT(*) cnt_orders,
        AVG(COUNT(*)) OVER() avg_cnt_orders
    FROM customer c
    INNER JOIN orders o ON c.customer_pk = o.customer_fk 
    GROUP BY c.grid_section
) t
WHERE cnt_orders = ROUND(avg_cnt_orders)

请注意,我在您的查询中删除了DISTINCT 它们在诸如您的第一个 SQL 之类的聚合查询中不需要 - 但您的问题没有提供有关不同实体之间基数的很多详细信息,因此您可能需要根据您的实际设计进行调整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM