sql - 在 Oracle SQL 中重新排列值
问题描述
我们在表格中获取以下格式的数据:
正如我们在上面的截图中看到的:
Item1 仅映射到 1 个值 = Data1。(A 列和 B 列)
Item2 映射到 Data11 和 Data12。(A 列和 B 列)
Item2 Data11 和 Data12 也映射到 Item1.Data1(AB 列和 CD 列)
对于整个映射,我们得到的值
我们想使用 VBA 透视数据并以以下格式显示它(我们有 9 列 Item1 到 Item9。为简单起见,我们在下面只添加了 3 列):
我们进行了头脑风暴,但没有得到任何答案。请帮助我们实现这一目标的最佳方法是什么?
解决方案
此查询使用子查询分解来获得您的答案:
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;
这会产生相同的结果。
推荐阅读
- python-2.7 - Python:导入从何而来?
- python - 在 Python 中的列表上/内部拆分
- leaflet - 我可以使用 Leaflet Draw 将图层添加到覆盖图层吗?
- node.js - 如何使用 multer 在 node.js 服务器中上传文件
- sql - 进行数百个数据库更新的正确方法?
- python - 将文本文件中列出的特定文件从源文件夹复制到目标文件夹
- ffmpeg - FFMpeg:如何使用 between() 选择最后一秒?
- libreoffice-writer - 使用 LibreOffice 拼写检查器
- php - 不考虑 PHP 顺序的字符串比较
- kubernetes - Spinnaker - 在清单中引用 ConfigMap 版本化值