Complex Query
Date: Tue, 15 Feb 2011 07:32:04 -0800 (PST)
Message-ID: <eed5cb9b-f686-4ef9-8742-1358f680f00b_at_o14g2000prb.googlegroups.com>
Hi,
I am using this query. It returns information on existing orders the customer has, and ranks them based on the status.
We have 25 products defined in a separate table. Rather than having to keep doing a COUNT to check for a given product, I am hoping to somehow modify this query such that it returns a record for ALL products. If the customer does not have that product, it will give NULL values for the status column. right now I cannot find any way to do that join, I know it is some outer join.
It may be a WITH query, which I always have trouble creating, but maybe someone can help, I've been at this for a few days.
So, for a customer with 4 orders, this query returns 4 records. I'd like it to return 25 (total orders in products table) and just a NULL or 'N' for products the customer does not have.
SELECT email, customer_id, subproduct_id, description, status, rnum,
status_rank
FROM (SELECT email, customer_id, subproduct_id, status, rnum,
status_rank, description
FROM (SELECT email, c.customer_id, subproduct_id, status, description,
CASE status
WHEN 'Active' THEN 1
WHEN 'Pending' THEN 2
WHEN 'Complete' THEN 3
WHEN 'Cancelled' THEN 4
END status_rank,
ROW_NUMBER() OVER (PARTITION BY subproduct_id
ORDER BY subproduct_id) rnum
FROM customer c, customer_account ca,
customer_address cd, customer_order_vw co
WHERE c.customer_id = ca.customer_id(+)
AND c.customer_id = cd.customer_id(+)
AND c.customer_id = co.customer_id(+)
AND c.customer_id = 312039939)
ORDER BY status_rank, rnum)
WHERE rnum = 1;
Received on Tue Feb 15 2011 - 09:32:04 CST
