繁体   English   中英

Oracle SQL-基于嵌套查询结果的SUM数据

[英]Oracle SQL - SUM data based on a result from a nested query

我有一个嵌套查询,应该执行以下操作:

  1. 底部查询创建名为“ INITIATIVE”的列,并基于“ BU_ID”标记该列中的记录。
  2. 然后,SUBQRY使用LAG功能检查5年前是否有任何记录。 这基于“ CUSTID”和“ INITIATIVE”(在步骤1中定义)。
  3. 最后,顶部查询创建了名为“ TRANSACTION_FLAG”的列,该列将标记记录“ New”或“ Existing”。 查询60个月后是否有任何交易。

请参阅下面的查询:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM