У меня есть вложенный запрос, который, как предполагается сделать следующее:Oracle SQL - данные SUM на основе результата из вложенного запроса
- Bottom запрос создает столбец с именем «ИНИЦИАТИВА» и флаги записей в этой колонке на основе на «BU_ID».
- Затем SUBQRY использует функцию LAG, чтобы проверить, были ли записи за 5 лет назад. Это основано на «CUSTID» и «ИНИЦИАТИВЕ» (которое было определено на шаге 1).
- Наконец, в верхнем запросе создан столбец с именем «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.
Когда вы говорите, суммируйте их - вы имеете в виду объединить их в одну строку, так что весь вывод будет всего 4 строки? Это происходит только в первый месяц? Например, если вы получаете две позиции в 2015 году в том же месяце, они не суммируют? –
@ Peter M. Я бы не возражал против результата, который был бы только 4-мя линиями. На самом деле это может быть еще лучше. Мне нужно будет проверить две вещи: 1-й) Количество новых транзакций; И вот этот запрос изначально был построен. Цель заключалась не в том, чтобы считать строки 1 и 2 как две новые транзакции. 2nd) Позже меня попросили также суммировать значения новых транзакций. Поэтому суммирование строк 1 и 2 для отображения одной строки только со значением 71 будет работать хорошо. Конечно, может быть несколько строк, а не только два, которые могут соответствовать критериям. – Blase
Вам нужно научиться отступу, это невозможно прочитать. – Hogan