[英]Oracle SQL Developer how to get a sum from the result of another query
[英]Oracle SQL - SUM data based on a result from a nested query
我有一个嵌套查询,应该执行以下操作:
请参阅下面的查询:
SELECT
"REGION"
, "COUNTRY"
, "CUSTID"
, "CUSTOMER"
, "VERTICAL"
, "DATE_YEARMONTH"
, "DATE_YEAR"
, "ORDER_VALUE"
, "INITIATIVE"
, MAX(CASE WHEN TO_DATE("PREV_FYM_INITIATIVE",'YYYYMM') >= ADD_MONTHS (TO_DATE("DATE_YEARMONTH",'YYYYMM'), -60) THEN 'Existing' ELSE 'New' END) "TRANSACTION_FLAG"
FROM
(
SELECT
SUBQRY."REGION"
, SUBQRY."COUNTRY"
, SUBQRY."CUSTID"
, SUBQRY."CUSTOMER"
, SUBQRY."VERTICAL"
, SUBQRY."DATE_YEARMONTH"
, SUBQRY."DATE_YEAR"
, SUBQRY."ORDER_VALUE"
, SUBQRY."INITIATIVE"
, LAG (SUBQRY."DATE_YEARMONTH", 1) OVER (PARTITION BY SUBQRY."CUSTID", SUBQRY."INITIATIVE" ORDER BY "DATE_YEARMONTH" ASC) "PREV_FYM_INITIATIVE"
FROM
(
SELECT
T1."REGION"
, T1."COUNTRY"
, T1."CUSTID"
, T1."CUSTOMER"
, T1."VERTICAL"
, T3."DATE_YEARMONTH"
, T3."DATE_YEAR"
, T4."ORDER_VALUE"
, T3."DATE_DESC"
, (CASE
WHEN T2."BU_ID" IN ('ACC', 'LXC', 'OTP') THEN 'Process'
ELSE 'NOT Process' END) "INITIATIVE"
FROM
"LIBRARY"."FACTSALES" T4
, "LIBRARY"."CUSTOMER_TBL" T1
, "LIBRARY"."PRODUCT_TBL" T2
, "LIBRARY"."TIME_TBL" T3
WHERE
T4."CUSTOMER_KEY" = T1."CUSTOMER_KEY"
AND T4."PRODUCT_KEY" = T2."PRODUCT_KEY"
AND T4."DATE_KEY" = T3."DATE_KEY"
AND T1."COUNTRY" IN ('Austria', 'Germany', 'France')
AND T3."DATE_YEAR" BETWEEN '2012'AND '2016'
AND T4."ORDER_VALUE" > 0
GROUP BY
T1."REGION"
, T1."COUNTRY"
, T1."CUSTID"
, T1."CUSTOMER"
, T1."VERTICAL"
, T3."DATE_YEARMONTH"
, T3."DATE_YEAR"
, T4."ORDER_VALUE"
, T3."DATE_DESC"
, T2."BU_ID"
) SUBQRY )
WHERE "INITIATIVE" LIKE 'Process'
GROUP BY
"REGION"
, "COUNTRY"
, "CUSTID"
, "CUSTOMER"
, "VERTICAL"
, "DATE_YEARMONTH"
, "DATE_YEAR"
, "ORDER_VALUE"
, "INITIATIVE";
可以说,我在单个客户的示例中得到以下结果:
REGION COUNTRY CUSTID CUSTOMER VERTICAL DATE_YEARMONTH DATE_YEAR ORDER_VALUE INITIATIVE TRANSACTION_FLAG
1. North Germany 25166 Abraxo Cleaner Chemicals 201201 2012 25.50 Process New
2. North Germany 25166 Abraxo Cleaner Chemicals 201201 2012 45.50 Process Existing
3. North Germany 25166 Abraxo Cleaner Chemicals 201405 2014 73.49 Process Existing
4. North Germany 25166 Abraxo Cleaner Chemicals 201507 2015 156.29 Process Existing
5. North Germany 25166 Abraxo Cleaner Chemicals 201511 2015 376.22 Process Existing
如您所见,行号 1被标记为“新”。 所有其他行都标记为“现有”,因为这些行比第一行晚在数据库中预订。 但是,行号。 同一天有2人预订。
我需要实现的是将SUM行标记为“ New”,而这些行“已存在”但属于同一DATE_YEARMONTH。 回到上面的5行。 我需要对行号求和。 1和2。总价值为71。或者也许有一种简单的方法来标记这样的记录,而不是累加起来? 当我下载查询结果时,这将使我可以轻松地在excel中汇总这些内容。
ps如果有任何用处,则使用的查询源自我之前的文章: Oracle SQL-flag根据记录的日期与历史记录进行记录 。
将底部查询更改为类似下面的内容。
您需要将其他查询更改为将我的名称从ORDER_VALUE更改为ORDER_VALUE_TOTAL。 如果要查看其他查询,请同时输入ORDER_COUNT。 希望这一点很容易弄清楚。
SELECT
T1."REGION"
, T1."COUNTRY"
, T1."CUSTID"
, T1."CUSTOMER"
, T1."VERTICAL"
, T3."DATE_YEAR"
, T3."DATE_YEARMONTH"
, T3."DATE_DESC"
, (CASE
WHEN T2."BU_ID" IN ('ACC', 'LXC', 'OTP') THEN 'Process'
ELSE 'NOT Process' END) "INITIATIVE"
, SUM(T4."ORDER_VALUE") "ORDER_VALUE_TOTAL"
, COUNT(*) "ORDER_COUNT"
FROM
"LIBRARY"."FACTSALES" T4
, "LIBRARY"."CUSTOMER_TBL" T1
, "LIBRARY"."PRODUCT_TBL" T2
, "LIBRARY"."TIME_TBL" T3
WHERE
T4."CUSTOMER_KEY" = T1."CUSTOMER_KEY"
AND T4."PRODUCT_KEY" = T2."PRODUCT_KEY"
AND T4."DATE_KEY" = T3."DATE_KEY"
AND T1."COUNTRY" IN ('Austria', 'Germany', 'France')
AND T3."DATE_YEAR" BETWEEN '2012'AND '2016'
AND T4."ORDER_VALUE" > 0
GROUP BY
T1."REGION"
, T1."COUNTRY"
, T1."CUSTID"
, T1."CUSTOMER"
, T1."VERTICAL"
, T3."DATE_YEAR"
, T3."DATE_YEARMONTH"
, T3."DATE_DESC"
, (CASE
WHEN T2."BU_ID" IN ('ACC', 'LXC', 'OTP') THEN 'Process'
ELSE 'NOT Process' END)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.