Как получить уникальное количество декодированных / неотключенных строк (от столбца к строке) - PullRequest
0 голосов
/ 02 апреля 2019

Работа с БД Oracle.
Возникла проблема с преобразованием набора столбцов в строки и получением уникального числа для каждой строки.

Я работаю с таблицей, которая определяет набор значений (до шести), которые привязаны к определенному номеру счета.Я хотел снять эти шесть столбцов так, чтобы они были перечислены в собственной строкеКаждая строка будет иметь счетчик, представляющий позиционное значение (т. Е. Значение 1 = 1, значение 3 = 3 и т. Д.)

Например, у меня есть таблица, как показано ниже.Значения (1-6) всегда будут уникальными для номера счета

AccountNumber|Value1|Value2|Value3|Value4|Value5|Value6
-------------------------------------------------------
1            |123   |1234  |12345 |12    |12345 |1234
2            |123   |1234  |12345 |12    |12345 |1234
3            |123   |1234  |12345 |12    |12345 |1234

И я хочу, чтобы порядок приоритета был прикреплен к номеру значения.

AccountNumber|Order|Value
-------------------------
1            |1    |123
1            |2    |1234
1            |3    |12345
1            |4    |12
1            |5    |123456
1            |6    |1
2            |1    |123
2            |2    |1234
2            |3    |12345
2            |4    |12
2            |5    |123456
2            |6    |1
3            |1    |123
3            |2    |1234
3            |3    |12345
3            |4    |12
3            |5    |123456
3            |6    |1

У меня есть следующее,

SELECT
'1' AS FACILITYID,
HL.ACCOUNT_ID AS AccountNumber,
--UNPIVOT_ROW,
DECODE(UNPIVOT_ROW, 1, TDL.DX_ONE_ID,
                    2, TDL.DX_TWO_ID,
                    3, TDL.DX_THREE_ID,
                    4, TDL.DX_FOUR_ID,
                    5, TDL.DX_FIVE_ID,
                    6, TDL.DX_SIX_ID) AS Value,

FROM ACCOUNT_LIST HL
INNER JOIN TRANSACTIONS TRAN ON HL.ACCOUNT_ID = TRAN.ACCOUNT_ID,
(SELECT LEVEL AS UNPIVOT_ROW FROM DUAL CONNECT BY LEVEL <= 6)

Я могу отменить поворот (используя DECODE (), UNPIVOT () вызывал у меня проблемы), но я не могу обернутьмоя голова связана с уникальным подсчетом.

Это, вероятно, просто, но я просто теряю голову, пытаясь придумать эффективный способ обработки более 20000 строк, прежде чем я развернусь без больших накладных расходов.

Я пытался вернуть значение UNPIVOT_ROW и использовать второй декодер для вывода числа, но он просто продолжал выплевывать число '1'

Любая помощь или предложения будут с благодарностью!

1 Ответ

1 голос
/ 02 апреля 2019

Я думаю, вы слишком усложняете это, и вам просто нужна базовая операция отмены:

select account_id as "AccountNumber", position as "Order", value as "Value" 
from (
  select 1 as facility_id, hl.account_id, tdl.dx_one_id, tdl.dx_two_id,
    tdl.dx_three_id, tdl.dx_four_id, tdl.dx_five_id, tdl.dx_six_id
  from account_list hl
  inner join transactions tdl on hl.account_id = tdl.account_id
)
unpivot (value for position in (dx_one_id as 1, dx_two_id as 2, dx_three_id as 3,
                                dx_four_id as 4, dx_five_id as 5, dx_six_id as 6))

Демо с начальными данными, соответствующими вашему первому примеру:

-- CTEs for sample data
with account_list (account_id) as (
            select 1 from dual
  union all select 2 from dual
  union all select 3 from dual
),
transactions (account_id, dx_one_id, dx_two_id, dx_three_id, dx_four_id, dx_five_id, dx_six_id) as (
            select 1, 123, 1234, 12345, 12, 12345, 1234 from dual
  union all select 2, 123, 1234, 12345, 12, 12345, 1234 from dual
  union all select 3, 123, 1234, 12345, 12, 12345, 1234 from dual
)
-- actual query
select account_id as "AccountNumber", position as "Order", value as "Value" 
from (
  select 1 as facility_id, hl.account_id, tdl.dx_one_id, tdl.dx_two_id,
    tdl.dx_three_id, tdl.dx_four_id, tdl.dx_five_id, tdl.dx_six_id
  from account_list hl
  inner join transactions tdl on hl.account_id = tdl.account_id
)
unpivot (value for position in (dx_one_id as 1, dx_two_id as 2, dx_three_id as 3,
                                dx_four_id as 4, dx_five_id as 5, dx_six_id as 6))
order by facility_id, account_id, position;

, который получает

AccountNumber      Order      Value
------------- ---------- ----------
            1          1        123
            1          2       1234
            1          3      12345
            1          4         12
            1          5      12345
            1          6       1234
            2          1        123
            2          2       1234
            2          3      12345
            2          4         12
            2          5      12345
            2          6       1234
            3          1        123
            3          2       1234
            3          3      12345
            3          4         12
            3          5      12345
            3          6       1234

18 rows selected. 
...