Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

ROLLUP by week, customer_id

PugzlyJan 17 2023

I'm trying to use the ROLLUP function to display week totals for each customer. Once every total for the customer is displayed for that week I want to show the total for the week for all customers.

I posted a snippet of my expected output but I'm obviously doing something incorrect and can't seem to figure out how to get this to work. Below is my test CASE. Any help would be greatly appreciated. 

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, 'Faith', 'Mazzarone' FROM DUAL UNION ALL
SELECT 2, 'Lisa', 'Saladino' FROM DUAL UNION ALL
SELECT 3, 'Micheal', 'Palmice' FROM DUAL UNION ALL
SELECT 4, 'Jerry', 'Torchiano' FROM DUAL;

CREATE TABLE items 
(PRODUCT_ID, PRODUCT_NAME, PRICE) AS
SELECT 100, 'Black Shoes', 79.99 FROM DUAL UNION ALL
SELECT 101, 'Brown Pants', 111.99 FROM DUAL UNION ALL
SELECT 102, 'White Shirt', 10.99 FROM DUAL;

CREATE TABLE purchases
(CUSTOMER_ID, PRODUCT_ID, QUANTITY, PURCHASE_DATE) AS
SELECT 1, 101, 3, TIMESTAMP'2022-10-11 09:54:48' FROM DUAL UNION ALL
SELECT 1, 100, 1, TIMESTAMP '2022-10-12 19:04:18' FROM DUAL UNION ALL
SELECT 2, 101,1, TIMESTAMP '2022-10-11 09:54:48' FROM DUAL UNION ALL
SELECT 2, 101, 3, TIMESTAMP '2022-10-17 19:34:58' FROM DUAL UNION ALL
SELECT 2, 102, 3,TIMESTAMP '2022-12-06 11:41:25' + NUMTODSINTERVAL ( LEVEL * 2, 'DAY') FROM  dual CONNECT BY  LEVEL <= 6 UNION ALL
SELECT 2, 102, 3,TIMESTAMP '2022-12-26 11:41:25' + NUMTODSINTERVAL ( LEVEL * 2, 'DAY') FROM  dual CONNECT BY  LEVEL <= 6 UNION ALL
SELECT 3, 101,1, TIMESTAMP '2022-12-21 09:54:48' FROM DUAL UNION ALL
SELECT 3, 102,1, TIMESTAMP '2022-12-27 19:04:18' FROM DUAL UNION ALL
SELECT 3, 102, 4,TIMESTAMP '2022-12-22 21:44:35' + NUMTODSINTERVAL ( LEVEL * 2, 'DAY') FROM    dual
CONNECT BY  LEVEL <= 15 UNION ALL 
SELECT 3, 101,1, TIMESTAMP '2022-12-11 09:54:48' FROM DUAL UNION ALL
SELECT 3, 102,1, TIMESTAMP '2022-12-17 19:04:18' FROM DUAL UNION ALL
SELECT 3, 102, 4,TIMESTAMP '2022-12-12 21:44:35' + NUMTODSINTERVAL ( LEVEL * 2, 'DAY') FROM    dual
CONNECT BY  LEVEL <= 5;


SELECT 
             TO_CHAR (p.purchase_date, 'YYYY/IW') year_week,
             p.customer_id,
             c.first_name,
             c.last_name,   
            SUM (p.quantity * i.price) total_amt
        FROM purchases p
        JOIN customers c ON p.customer_id = c.customer_id
       JOIN items i ON p.product_id = i.product_id
           GROUP BY 
             to_char(p.purchase_date, 'YYYY/IW'),
            p.customer_id,
            c.first_name,
            c.last_name,
            ROLLUP (TO_CHAR (p.purchase_date, 'YYYY/IW')), p.customer_id 
   ORDER BY to_char(p.purchase_date, 'YYYY/IW'),
 p.customer_id;

EXPECTED OUTPUT 
=================

YEAR_WEEK	CUSTOMER_ID	FIRST_NAME	LAST_NAME	TOTAL_AMT
2022/41	1	Faith	Mazzarone	415.96
2022/41	2	Lisa	Saladino	111.99
	527.95
2022/42	2	Lisa	Saladino	335.97       
        335.97
        
….
….
….	

This post has been answered by Frank Kulash on Jan 17 2023
Jump to Answer
Comments
Post Details
Added on Jan 17 2023
8 comments
398 views