首页 > 解决方案 > 在 Oracle SQL 中重新排列值

问题描述

我们在表格中获取以下格式的数据:

在此处输入图像描述

正如我们在上面的截图中看到的:

Item1 仅映射到 1 个值 = Data1。(A 列和 B 列)

Item2 映射到 Data11 和 Data12。(A 列和 B 列)

Item2 Data11 和 Data12 也映射到 Item1.Data1(AB 列和 CD 列)

对于整个映射,我们得到的值

我们想使用 VBA 透视数据并以以下格式显示它(我们有 9 列 Item1 到 Item9。为简单起见,我们在下面只添加了 3 列):

在此处输入图像描述

我们进行了头脑风暴,但没有得到任何答案。请帮助我们实现这一目标的最佳方法是什么?

标签: sqloracle

解决方案


此查询使用子查询分解来获得您的答案:

WITH test_data (a, b, c, d) AS
(
  SELECT 'Item1', 'Data1', 'Item2', 'Data11' FROM DUAL UNION ALL
  SELECT 'Item1', 'Data1', 'Item2', 'Data12' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data11', 'Item3', 'Data21' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data11', 'Item3', 'Data22' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data12', 'Item3', 'Data21' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data12', 'Item3', 'Data22' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data12', 'Item3', 'Data23' FROM DUAL
),
subquery_factoring (Item1, Item2, Item3, Query_Level) AS
(
  SELECT td.b, td.d, NULL, 0
  FROM test_data td
  WHERE td.a = 'Item1'
  UNION ALL
  SELECT sf.Item1, sf.Item2, td.d, sf.query_level+1
  FROM subquery_factoring sf
  INNER JOIN test_data td ON td.a = 'Item2' AND sf.item2 = td.b
  WHERE sf.query_level = 0
)CYCLE Item1 SET is_cycle TO 'Y' DEFAULT 'N'
SELECT sf.item1, sf.item2, sf.item3
FROM subquery_factoring sf
WHERE sf.query_level = 1

编辑1:更简单

我可能有点想多了。相反,也许试试这个:

WITH test_data (a, b, c, d) AS
(
  SELECT 'Item1', 'Data1', 'Item2', 'Data11' FROM DUAL UNION ALL
  SELECT 'Item1', 'Data1', 'Item2', 'Data12' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data11', 'Item3', 'Data21' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data11', 'Item3', 'Data22' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data12', 'Item3', 'Data21' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data12', 'Item3', 'Data22' FROM DUAL UNION ALL
  SELECT 'Item2', 'Data12', 'Item3', 'Data23' FROM DUAL
)
SELECT td1.b AS Item1, td1.d AS Item2, td2.d AS Item3
FROM test_data td1
INNER JOIN test_data td2 ON td1.c = td2.a;

这会产生相同的结果。


推荐阅读