Re: Complex Query
Date: Mon, 11 May 2009 06:41:39 -0700 (PDT)
Message-ID: <0109b5e8-f75b-4939-9205-12677429efbf_at_z7g2000vbh.googlegroups.com>
On May 8, 6:28 pm, Mark D Powell <Mark.Pow..._at_eds.com> wrote:
> On May 8, 6:30 pm, Shakespeare <what..._at_xs4all.nl> wrote:
>
>
>
> > a..._at_unsu.com schreef:
>
> > > I am trying to make a query with virtual tables to apply 2 different
> > > sets of criteria and get 2 columns from 1 table. It almost works.
> > > But if you look at the query, the issue is that the column ORDER_DATE
> > > appears in both virtual tables, so I get an error.
>
> > > But it is the ORDER_DATE which is the key here, as I want one date per
> > > line with the different figures:
>
> > > SELECT order_date, trials, annuals
> > > FROM (SELECT order_date, trials
> > > FROM (SELECT TRUNC(order_date) order_date, COUNT(*)
> > > OVER (PARTITION BY TRUNC(order_date)) trials
> > > FROM engine.customer_order co, engine.order_line ol,
> > > engine.product p
> > > WHERE co.order_id = ol.order_id
> > > AND ol.product_id = p.product_id
> > > AND p.subproduct_id = 197
> > > AND confirm = 'Trial2Paid'
> > > AND order_date >= TO_DATE('03012009','MMDDYYYY'))),
> > > (SELECT order_date, annuals
> > > FROM (SELECT TRUNC(order_date) order_date, COUNT(*)
> > > OVER (PARTITION BY TRUNC(order_date)) annuals
> > > FROM engine.customer_order co, engine.order_line ol,
> > > engine.product p
> > > WHERE co.order_id = ol.order_id
> > > AND ol.product_id = p.product_id
> > > AND p.subproduct_id = 197
> > > AND confirm = 'AutoRenew'
> > > AND order_date >= TO_DATE('03012009','MMDDYYYY')
> > > AND ((p.quantity = 12 AND p.quantity_uom = 'month') OR
> > > (p.quantity = 1 AND p.quantity_uom = 'year'))))
>
> > Since you claim to be a senior DBA, you should know how to alias your
> > tables and columns and how to prefix your columns with the table
> > aliases.....
>
> > Shakespeare- Hide quoted text -
>
> > - Show quoted text -
>
> Shakespeare coud have said it nicer but he is right in that all you
> should need to do is prefix your column list.
>
> HTH -- Mark D Powell --
Well, the issue is with that 'order date' column. Seems if I use it in my order by, depending on which one I use, it changes the output of the query. So, I know I can prefix the column. That has nothing to do with my question. See what I've done and what my output is:
If I change the query to this, and use PARTITION BY order_date_1 in line #3, I'll get the following output, which is wrong for the 'annual' column:
SELECT order_date_1, trials, order_date_2, annuals, rnum FROM (SELECT order_date_1, trials, order_date_2, annuals, ROW_NUMBER()
OVER (PARTITION BY order_date_1 ORDER BY order_date_1) rnum FROM (SELECT order_date_1, trials FROM (SELECT TRUNC(order_date) order_date_1, COUNT(*) OVER (PARTITION BY TRUNC(order_date)) trials FROM engine.customer_order co, engine.order_line ol, engine.product p WHERE co.order_id = ol.order_id AND ol.product_id = p.product_id AND p.subproduct_id = 197 AND confirm = 'Trial2Paid' AND order_date >= TO_DATE ('03012009','MMDDYYYY'))), (SELECT order_date_2, annuals FROM (SELECT TRUNC(order_date) order_date_2, COUNT(*) OVER (PARTITION BY TRUNC(order_date)) annuals FROM engine.customer_order co, engine.order_line ol, engine.product p WHERE co.order_id = ol.order_id AND ol.product_id = p.product_id AND p.subproduct_id = 197 AND confirm = 'AutoRenew' AND order_date >= TO_DATE('03012009','MMDDYYYY') AND ((p.quantity = 12 AND p.quantity_uom ='month') OR (p.quantity = 1 AND p.quantity_uom = 'year'))))) WHERE rnum = 1;
ORDER_DAT TRIALS ORDER_DAT ANNUALS RNUM
--------- ---------- --------- ---------- ---------- 01-MAR-09 55 01-MAR-09 2 1 02-MAR-09 20 01-MAR-09 2 1 03-MAR-09 103 01-MAR-09 2 1 04-MAR-09 19 01-MAR-09 2 1 05-MAR-09 17 01-MAR-09 2 1 06-MAR-09 13 01-MAR-09 2 1 07-MAR-09 2 01-MAR-09 2 1 08-MAR-09 9 01-MAR-09 2 1
If I change the PARTITION BY and use order_date_2 in row #3, I get the opposite effect:
SELECT order_date_1, trials, order_date_2, annuals, rnum FROM (SELECT order_date_1, trials, order_date_2, annuals, ROW_NUMBER()
OVER (PARTITION BY order_date_2 ORDER BY order_date_2) rnum FROM (SELECT order_date_1, trials FROM (SELECT TRUNC(order_date) order_date_1, COUNT(*) OVER (PARTITION BY TRUNC(order_date)) trials FROM engine.customer_order co, engine.order_line ol, engine.product p WHERE co.order_id = ol.order_id AND ol.product_id = p.product_id AND p.subproduct_id = 197 AND confirm = 'Trial2Paid' AND order_date >= TO_DATE ('03012009','MMDDYYYY'))), (SELECT order_date_2, annuals FROM (SELECT TRUNC(order_date) order_date_2, COUNT(*) OVER (PARTITION BY TRUNC(order_date)) annuals FROM engine.customer_order co, engine.order_line ol, engine.product p WHERE co.order_id = ol.order_id AND ol.product_id = p.product_id AND p.subproduct_id = 197 AND confirm = 'AutoRenew' AND order_date >= TO_DATE('03012009','MMDDYYYY') AND ((p.quantity = 12 AND p.quantity_uom ='month') OR (p.quantity = 1 AND p.quantity_uom = 'year'))))) WHERE rnum = 1;
ORDER_DAT TRIALS ORDER_DAT ANNUALS RNUM
--------- ---------- --------- ---------- ---------- 01-MAR-09 55 01-MAR-09 2 1 01-MAR-09 55 02-MAR-09 2 1 01-MAR-09 55 04-MAR-09 3 1 01-MAR-09 55 05-MAR-09 3 1 01-MAR-09 55 06-MAR-09 1 1 01-MAR-09 55 07-MAR-09 3 1 01-MAR-09 55 08-MAR-09 5 1 01-MAR-09 55 09-MAR-09 3 1
So, I'm still perplexed on how to do this. I'm sure it is possible, just have to find the right subqueries that will do it........ Received on Mon May 11 2009 - 08:41:39 CDT