sql - 在 Oracle SQL 的一个查询中显示 3 个不同的查询
问题描述
目前我正在研究包含的数据库
顾客
->
CUSTOMER_ID
NAME
ADDRESS
WEBSITE
CREDIT_LIMIT
订单
->
ORDER_ID
CUSTOMER_ID
STATUS
SALESMAN_ID
ORDER_DATE
order_items
->
ORDER_ID
ITEM_ID
PRODUCT_ID
QUANTITY
UNIT_PRICE
我想创建一个 SQL 查询来显示
- 总订单金额超过所有订单平均金额的客户数量,
- 总订单金额低于所有订单平均金额的客户数量,
- 没有订单的客户数和客户总数。
- 客户总数
这是我迄今为止的尝试。(我知道这还不够)
SELECT 'Number of customers with total purchase amount over average: ' || COUNT(DISTINCT c.customer_id) AS "Report" FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id INNER JOIN order_items oi ON o.order_id = oi.order_id WHERE UNION SELECT 'Number of customers with total purchase amount below average: ' || COUNT(DISTINCT c.customer_id) AS "Report" FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id INNER JOIN order_items oi ON o.order_id = oi.order_id UNION SELECT 'Number of customers with no orders: ' || COUNT(DISTINCT c.customer_id) AS "Report" FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id WHERE o.customer_id IS NULL UNION SELECT 'Total number of customers: ' || COUNT(DISTINCT customer_id) AS "Report" FROM customers ORDER BY 1;
我现在只是尝试获取更容易查询的输出,所以我得到了 3、4 的正确输出。但是 1、2 ......我尝试了一些查询但没有工作......
如果您能在 1、2 方面帮助我,我将不胜感激。
如果有人能回答我的问题,我将不胜感激。
期望的输出
Report
------------------------------------------
Number of customers with total purchase amount over average: (number)
Number of customers with total purchase amount below average: (number)
Number of customers with no orders: (number)
Total number of customers: (number)
解决方案
您需要按如下方式使用windows功能:
SELECT COUNT(DISTINCT CUSTOMER_ID) FROM
(SELECT CUSTOMER_ID,
SUM(ORDER_TOTAL) OVER (PARTITION BY ORDER_ID) AS CUST_TOTAL,
AVG(ORDER_TOTAL) OVER () AS AVG_ALL
FROM
(SELECT C.CUSTOMER_ID,
O.ORDER_ID,
SUM(OI.UNIT_PRICE*OI.QUANTITY) AS ORDER_TOTAL
FROM CUSTOMERS C
JOIN ORDERS O ON O.CUSTOMER_ID = C.CUSTOMER_ID
JOIN ORDER_ITEMS OI ON OI.ORDER_ID = O.ORDER_ID
GROUP BY C.CUSTOMER_ID,
O.ORDER_ID))
WHERE CUST_TOTAL > AVG_ALL -- point 1
--WHERE CUST_TOTAL < AVG_ALL -- point 2
推荐阅读
- sql - SQL Server 子字符串引发错误“多个结果”
- android - 在 Kotlin 中比较两个不可为空的 LocalDateTime 时出现 NullPointerException
- filesystems - 从 S3 对象存储读取和写入文件到 winSCP
- oracle - LiquibasePro 不会在 changeLog 文件中生成 package、packagebody 等
- angular - 如何取消订阅角度参数更改的所有订阅
- r - 如何根据日期、团队和竞争在 R 中创建连续(或运行形式)?
- javascript - Firebase 函数。https.onCall 返回 null
- reactjs - 如何使用reactjs在另一个输入字段中显示输入字段值?
- android - 用户注销 React Native 应用程序时如何删除 Firebase 云消息传递令牌?
- uwp - UWP 应用:WebView:如何允许来自应用本地网页中的 window.external.notify