В программе, которую я поддерживаю, мы получили заказчик массивным (~ 500 строк) SQL-заявлением. Он используется для создания плоских файлов с фиксированными записями длины для передачи данных другому крупному бизнесу. Поскольку его массивный плоский файл не реляционный, а стандартные нормальные формы данных рушится. Итак, если у вас есть запись, которая может содержать несколько кодов, в этом случае до 19, все они записываются в одну строку, а отдельные поля - в плоском файле.Свернуть несколько записей в одну запись с несколькими столбцами
Примечание: этот пример упрощен.
Данные могут выглядеть следующим образом, с тремя столами:
RECORDS
record_id firstname lastname
--------------------------------
123 Bob Schmidt
324 George Washington
325 Ronald Reagan
290 George Clooney
CODE_TABLE
code_id code_cd code_txt
--------------------------------
5 3 President
2 4 Actor
3 7 Plumber
CODES_FOR_RECORDS
record_id code_cd
-------------------
123 7
325 3
290 4
324 3
325 4
123 4
Это необходимо производить записи, как:
firstname lastname code1 code2 code3
Bob Schmidt Actor Plumber NULL
George Washington President NULL NULL
Ronald Reagon Actor President NULL
George Clooney Actor NULL NULL
Часть текущего запроса мы были даны, выглядит так, но с 19 кодовыми столбцами вместо 5:
select
x.record_id,
max(case when x.rankk = 1 then code_txt end) as CodeColumn1,
max(case when x.rankk = 2 then code_txt end) as CodeColumn2,
max(case when x.rankk = 3 then code_txt end) as CodeColumn3,
max(case when x.rankk = 4 then code_txt end) as CodeColumn4,
max(case when x.rankk = 5 then code_txt end) as CodeColumn5,
from
(
select
r.record_id,
ct.code_txt as ctag ,
dense_rank() over (partition by r.record_id order by cfr.code_id) as rankk
from
records as r
codes_for_records as cfr,
code_table as ct
where
r.record_id = cfr.record_id
and ct.code_cd = cfr.code_cd
and cfr.code_cd is not null
and ct.code_txt not like '%V%'
) as x
where
x.record_id is not null
group by
x.record_id
I trimm но фактические статуты включают в себя внутренний запрос и соединение и многое другое, где условия, но это должно получить эту идею. Мой мозг говорит мне, что должен быть лучший способ, но я не эксперт по SQL. Мы используем DB2 v8, если это помогает. И коды должны быть в отдельных столбцах, поэтому не объединяются вещи в одну строку. Есть ли более чистое решение, чем это?
Update:
Я в конечном итоге просто refacorting исходный запрос, он использует подоконник уродливую MAX() бизнес, но в целом запрос гораздо более удобным для чтения из-за переделки других частей.
Когда я пишу код для преобразования данных вручную, процедура выполняется редко до 1000 строк. Этот код выглядит довольно простым и понятным для меня. – HLGEM
Возможно, это то, что я не очень хорошо знаком с SQL, потому что для меня это кажется запутанным. И часть этого - 1000 строк, когда разделение на логические куски не плохо. 500 строк SQL, которые так взаимосвязаны, похоже, спагетти - это еще одна вещь, ИМХО. – troutinator