Oracle; Создать пользовательский свод из таблицы - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть это:

ZN  BTG     BST FS  IST         D
161 18262   BC  An  1577861387  1,8
161 18262   BC  Ab  1577861875  3,9
161 18262   FK  An  1577862769  3,8
161 18262   FK  Ab  1577863033  0,2
161 18262   B   An  1577863670  -0,2
161 18262   B   Ab  1577863866  1,1

Но я хочу это:

ZN  BTG   BC An      BC An  BC Ab      BC Ab  Fk An      Fk An  FK Ab  FK Ab  B An  B An  B Ab  B Ab
161 18262 1577861387 1,8    1577861875 3,9    1577862769 3,8  ......

Я не знаю с чего начать. Спасибо.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Если у вас есть фиксированный набор значений, вы можете использовать PIVOT с несколькими ключами:

SELECT *
FROM   table_name
PIVOT ( MAX(ist) AS ist, MAX(d) AS d FOR (bst, fs) IN (
  ('BC', 'An') AS bc_an,
  ('BC', 'Ab') AS bc_ab,
  ('FK', 'An') AS fk_an,
  ('FK', 'Ab') AS fk_ab,
  ('B',  'An') AS b_an,
  ('B',  'Ab') AS b_ab
) )

Итак, для ваших тестовых данных:

CREATE TABLE table_name ( ZN, BTG, BST, FS, IST, D ) AS
SELECT 161, 18262, 'BC', 'An', 1577861387, '1,8'  FROM DUAL UNION ALL
SELECT 161, 18262, 'BC', 'Ab', 1577861875, '3,9'  FROM DUAL UNION ALL
SELECT 161, 18262, 'FK', 'An', 1577862769, '3,8'  FROM DUAL UNION ALL
SELECT 161, 18262, 'FK', 'Ab', 1577863033, '0,2'  FROM DUAL UNION ALL
SELECT 161, 18262, 'B',  'An', 1577863670, '-0,2' FROM DUAL UNION ALL
SELECT 161, 18262, 'B',  'Ab', 1577863866, '1,1'  FROM DUAL

Это выводит:

 ZN |   BTG |  BC_AN_IST | BC_AN_D |  BC_AB_IST | BC_AB_D |  FK_AN_IST | FK_AN_D |  FK_AB_IST | FK_AB_D |   B_AN_IST | B_AN_D |   B_AB_IST | B_AB_D
--: | ----: | ---------: | :------ | ---------: | :------ | ---------: | :------ | ---------: | :------ | ---------: | :----- | ---------: | :-----
161 | 18262 | 1577861387 | 1,8     | 1577861875 | 3,9     | 1577862769 | 3,8     | 1577863033 | 0,2     | 1577863670 | -0,2   | 1577863866 | 1,1   

дБ <> скрипка здесь

0 голосов
/ 05 февраля 2020

Вы можете использовать условное агрегирование:

select zn, btg,
       max(case when bst = 'BC' and fs = 'An' then ist end) as bc_an_ist
       max(case when bst = 'BC' and fs = 'An' then d end) as bc_an_d,
       max(case when bst = 'BC' and fs = 'Ab' then ist end) as bc_ab_ist
       max(case when bst = 'BC' and fs = 'Ab' then d end) as bc_ab_d,
       . . .
from t
group by zn, btg
...