Oracle SQL 查询部分包含所需结果

Posted

技术标签:

【中文标题】Oracle SQL 查询部分包含所需结果【英文标题】:Oracle SQL query partially including the desired results 【发布时间】:2021-07-19 18:03:25 【问题描述】:

我的要求是显示国家名称、发票总数及其平均金额。此外,我只需要返回平均发票金额大于所有发票平均发票金额的国家/地区。

查询 Oracle 数据库

SELECT cntry.NAME, 
       COUNT(inv.NUMBER), 
       AVG(inv.TOTAL_PRICE)
FROM   COUNTRY cntry JOIN
       CITY ct ON ct.COUNTRY_ID = cntry.ID JOIN
       CUSTOMER cst ON cst.CITY_ID = ct.ID JOIN
       INVOICE inv ON inv.CUSTOMER_ID = cst.ID
GROUP BY cntry.NAME,
         inv.NUMBER,
         inv.TOTAL_PRICE
HAVING AVG(inv.TOTAL_PRICE) > (SELECT AVG(TOTAL_PRICE)
                               FROM INVOICE);

结果:奥地利 1 9500

预计:奥地利 2 4825

架构

国家

ID(INT)(PK) | NAME(VARCHAR)

城市

ID(INT)(PK) | NAME(VARCHAR) | POSTAL_CODE(VARCHAR) | COUNTRY_ID(INT)(FK)

客户

ID(INT)(PK) | NAME(VARCHAR) | CITY_ID(INT)(FK) | ADDRS(VARCHAR) | POC(VARCHAR) | EMAIL(VARCHAR) | IS_ACTV(INT)(0/1)

发票

ID(INT)(PK) | NUMBER(VARCHAR) | CUSTOMER_ID(INT)(FK) | USER_ACC_ID(INT) | TOTAL_PRICE(INT)

【问题讨论】:

您的 group by 包含 inv.number,而您的 select 包含 count(inv.number)。这些都是矛盾的。 total_price 也是如此。 【参考方案1】:

没有样本数据,我们无法真正判断这是否:

预期:奥地利 2 4825

是真是假。


无论如何:将GROUP BY 子句更改为

GROUP BY cntry.NAME

(即从中删除额外的两列)有什么好处吗?

【讨论】:

【参考方案2】:
`SELECT C.COUNTRY_NAME,COUNT(I.INVOICE_NUMBER),AVG(I.TOTAL_PRICE) AS AVERAGE 
  FROM COUNTRY AS C JOIN CITY AS CS ON C.ID=CS.COUNTRY_ID
 JOIN CUSTOMER AS CUS ON CUS.CITY_ID=CS.ID
 JOIN INVOICE AS I ON I.CUSTOMER_ID=CUS.ID
 GROUP BY C.COUNTRY_NAME,C.ID
 HAVING AVERAGE>(SELECT AVG(TOTAL_PRICE) FROM INVOICE`

【讨论】:

感谢您的回答;如果您 edit 您的问题并简要说明您的答案解决原始问题的原因,将会更有帮助。 虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。

以上是关于Oracle SQL 查询部分包含所需结果的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql 截取表中某一字段的部分作为该字段查询结果

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

Oracle SQL Count 或 Sum 以防万一查询?

oracle 的问题 执行SQL查询语句 出现:部分多字节字符

Oracle 集合操作

Oracle 减号查询。如果顶部 SQL 和底部 SQL 不包含 NULL,我如何获得带有 NULLS 的结果?