Я написал оператор SQL для экспорта результатов в таблицу Excel для аналитики. На данный момент у меня проблема:
Некоторые данные, которые разделены на 2 строки, но нуждаются в них как в 1 строке. Причиной этого является один столбец с разными значениями.
Я объясняю структуру: SQL создает эту таблицу (заголовки):
ROOT|INSERT_TS|COUNT_ALL|Order_Type|Input_Obj|Input_SUPP|IS_SIM|Last_TS|Status_Type|Count_Open
Пример данных с моей проблемой (это результат, который дает мой фактический SQL-оператор):
R |In_TS|C_AL|O|I_Obj|I_Supp|IS_Sim|La_TS|Status|C_Opn|
--+-----+----+-+-----+------+------+-----+------+-----+
76|date1|1451|a|file1|mass |1 |date2|work |1451 | <-- 1st part
76|date1|25 |a|file1|mass |1 |date2|final |0 | <-- 2nd part
76|date1|1 |b|file1|man |0 |date2|final |0 |
76|date1|1 |c|file1|mass |1 |date2|work |1 |
В конце я хочу это (моя цель после исправления SQL-запроса):
R |In_TS|C_AL|O|I_Obj|I_Supp|IS_Sim|La_TS|Status|C_Opn|
--+-----+----+-+-----+------+------+-----+------+-----+
76|date1|1476|a|file1|mass |1 |date2|work |1451 | <-- 1 row
76|date1|1 |b|file1|man |0 |date2|final |0 |
76|date1|1 |c|file1|mass |1 |date2|work |1 |
Это мой фактический запрос/оператор sql:
SELECT
distinct t1.ROOT r,
min(to_char(t1.INSERT_TS, 'YYYY.MM.DD HH24:MI')) in_ts,
count(distinct t1.tool_ID) c_al, -- this count give the number of modul steps in this "business tool" - no sum task is here needed
t1.ORDERTYPE o,
t1.I_OBJ,
t1.I_Supp,
t1.IS_SIM,
max(to_char(t1.LASTCHANGE_TS, 'DD.MM.YYYY HH24:MI')) la_ts,
t2.STATUS status,
sum(case when t2.STATUS != 'final' then 1 else 0 end) c_opn
FROM TOOL_DATA.FW_MAIN t1
left join TOOL_DATA.CONF_STATUS t2 on t2.tab = 'FW_MAIN' and t2.status_val = t1.status
GROUP BY
t1.ROOT, t1.ORDERTYPE, t1.I_OBJ, t1.I_SUPP, t1.I_SIM, t2.STATUS
ORDER BY 2 desc, 1 desc
;
Что я делаю и ищу, чтобы решить эту проблему самостоятельно:
Смотрю тут в этом сообществе и в гугле, нашел какую-то задачу про собственные функции определения и listagg, но и то, и другое не помогает, потому что колонка "Статус" выросла, а ряд не совмещается.
Есть ли у кого-нибудь здесь какие-либо идеи для меня, чтобы решить эту проблему?
Важно следующее:
- Колонка "О" идентична
- Колонка "R" идентична
- Столбец "IS_SIM" идентичен
- Колонка "C_AL" является кумулятивной.
- Col «C_Opn» суммирует только не «окончательные» наборы данных (лучше: оба значения суммируются, потому что xx + 0 = xx)
- Столбец «Статус» показывает только «рабочее» значение, если строки объединены, «финальное» значение удаляется.
Решение (спасибо ruudvan)
SELECT
distinct t1.ROOT r,
min(to_char(t1.INSERT_TS, 'YYYY.MM.DD HH24:MI')) in_ts,
count(distinct t1.tool_ID) c_al, -- this count give the number of modul steps in this "business tool" - no sum task is here needed
t1.ORDERTYPE o,
t1.I_OBJ,
t1.I_Supp,
t1.IS_SIM,
max(to_char(t1.LASTCHANGE_TS, 'DD.MM.YYYY HH24:MI')) la_ts,
NVL(MAX(case when t2.STATUS != 'final' then t2.STATUS else null end), 'final'), -- i set it to != 'final', because status have more as 1 work value, but i wrote it here for a simple view
sum(case when t2.STATUS != 'final' then 1 else 0 end) c_opn
FROM TOOL_DATA.FW_MAIN t1
left join TOOL_DATA.CONF_STATUS t2 on t2.tab = 'FW_MAIN' and t2.status_val = t1.status
GROUP BY
t1.ROOT, t1.ORDERTYPE, t1.I_OBJ, t1.I_SUPP, t1.I_SIM,
ORDER BY 2 desc, 1 desc
;