甲骨文;从表创建自定义枢轴

时间:2020-02-05 12:21:43

标签: sql oracle11g group-by pivot

我有这个:

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 个答案:

答案 0 :(得分:1)

假设您拥有一组固定的值,则可以将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   

db <>提琴here

答案 1 :(得分:0)

您可以使用条件聚合:

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