已购买和未购买的物品

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

我有以下设置,其中 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;

sql oracle join
1个回答
0
投票

您需要从

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
© www.soinside.com 2019 - 2024. All rights reserved.