我有以下设置,其中 2 件商品(105、106)尚未购买。我想修改查询以包含尚未购买的 2 件商品。它们应该显示为最后两行。我认为左连接可能有效,但我没有成功。任何帮助将不胜感激
我有以下设置,其中 2 件商品尚未购买(105、106)。
如何修改最后一个查询以显示购买次数为零的 2 件商品?由于没有购买,当我按数量降序排序时,它们应该出现在最后。
如果有更好的方法来重写这个查询,我对任何想法都非常开放。
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SS.FF';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
CREATE TABLE customers
(CUSTOMER_ID, FIRST_NAME, LAST_NAME) AS
SELECT 1, 'John', 'Doe' FROM DUAL;
CREATE TABLE items
(PRODUCT_ID, PRODUCT_NAME, PRICE) AS
SELECT 100, 'Presto 6-quart Pressure Cooker', 79.99 FROM DUAL UNION ALL
SELECT 101, 'Cuisinart 8-quart Pressure Cooker', 111.99 FROM DUAL UNION ALL
SELECT 102, 'Farberware 3-quart Pressure Cooker', 49.99 FROM DUAL UNION ALL
SELECT 103, 'Farberware 6-quart Pressure Cooker', 89.29 FROM DUAL UNION ALL
SELECT 104, 'Farberware 8-quart Pressure Cooker', 105.99 FROM DUAL UNION ALL
SELECT 105, 'Breville Fast Slow Pro Pressure Cooker 3 quart', 39.95 FROM DUAL UNION ALL
SELECT 106, 'Breville Fast Slow Pro Pressure Cooker 6 quart', 59.95 FROM DUAL;
create table purchases(
ORDER_ID NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
customer_id number,
PRODUCT_ID NUMBER,
QUANTITY NUMBER,
purchase_date timestamp
);
insert into purchases (customer_id, product_id, quantity, purchase_date)
select 1, 99+LEVEL,
2, TIMESTAMP '2024-04-03 05:18:03' + numtodsinterval ( (LEVEL -1) * 1, 'day' ) + numtodsinterval ( LEVEL * 37, 'minute' ) + numtodsinterval ( LEVEL * 3, 'second' ) FROM dual CONNECT BY LEVEL <= 5;
/* items never purchased */
select * from items i
where not exists
(select 1 from purchases p where p.product_id = i.PRODUCT_ID)
PRODUCT_ID PRODUCT_NAME PRICE
105 Breville Fast Slow Pro Pressure Cooker 3 quart 39.95
106 Breville Fast Slow Pro Pressure Cooker 6 quart
59.95
/* Total quantity purchased each item */
with prep (product_id, tot_quantity) as
(
select
product_id,
sum(quantity)
from purchases
group by product_id
)
SELECT
p.product_id,
I.product_name,
tot_quantity,
sum(tot_quantity * i.PRICE)
"TOTAL_AMT"
FROM prep p
JOIN items i ON i.product_id = p.product_id
GROUP BY p.product_id, i.product_name, tot_quantity
ORDER BY tot_quantity desc,
product_id;
您需要从
items
表开始,并外连接到 purchases
。对于 NULL
中的列,任何不匹配的行都将返回 purchases
,您可以将其转换为 0 数量,您已经按降序排序:
SELECT i.product_id,
i.product_name,
NVL(sum(p.quantity),0) * i.price total_amt
FROM items i
LEFT OUTER JOIN purchases p ON p.product_id = i.product_id
GROUP BY i.product_id,
i.product_name
ORDER BY sum(p.quantity) DESC