2016-07-12 4 views
0

У меня есть вложенный запрос, который, как предполагается сделать следующее:Oracle SQL - данные SUM на основе результата из вложенного запроса

  1. Bottom запрос создает столбец с именем «ИНИЦИАТИВА» и флаги записей в этой колонке на основе на «BU_ID».
  2. Затем SUBQRY использует функцию LAG, чтобы проверить, были ли записи за 5 лет назад. Это основано на «CUSTID» и «ИНИЦИАТИВЕ» (которое было определено на шаге 1).
  3. Наконец, в верхнем запросе создан столбец с именем «TRANSACTION_FLAG», который будет отмечать записи «Новый» или «Существующий». Запрос проверяет, были ли какие-либо транзакции 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, отмеченные «новыми», с линиями, которые являются «существующими», но попадают в тот же DATE_YEARMONTH. Итак, вернемся к 5 строкам выше. Мне нужно было бы суммировать строки нет. 1 и 2. для общего значения 71. Или, может быть, есть простой способ FLAG таких записей, вместо того, чтобы их поднять? Это позволило бы мне SUM легко справиться с этим, когда я загружу результаты запроса.

p.s. Если это используется, запрос используется из моего предыдущего сообщения: Oracle SQL- Flag records based on record's date vs history.

+0

Когда вы говорите, суммируйте их - вы имеете в виду объединить их в одну строку, так что весь вывод будет всего 4 строки? Это происходит только в первый месяц? Например, если вы получаете две позиции в 2015 году в том же месяце, они не суммируют? –

+0

@ Peter M. Я бы не возражал против результата, который был бы только 4-мя линиями. На самом деле это может быть еще лучше. Мне нужно будет проверить две вещи: 1-й) Количество новых транзакций; И вот этот запрос изначально был построен. Цель заключалась не в том, чтобы считать строки 1 и 2 как две новые транзакции. 2nd) Позже меня попросили также суммировать значения новых транзакций. Поэтому суммирование строк 1 и 2 для отображения одной строки только со значением 71 будет работать хорошо. Конечно, может быть несколько строк, а не только два, которые могут соответствовать критериям. – Blase

+0

Вам нужно научиться отступу, это невозможно прочитать. – Hogan

ответ

0

Измените нижний запрос на что-то вроде ниже.

Вам нужно будет исправить другие запросы для моего имени 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) 
+0

Это решило мою проблему. Спасибо. – Blase

Смежные вопросы