sql - 将行透视到列 Oracle SQL
问题描述
我目前正在处理一个表格,其中表格的格式是这样的(所有列都是 VARCHAR 类型,除了 INSERTDATE 列是 DATE 类型):
INSERTDATE | ID | PROPERTYNAME | PROPERTYVALUE
----------------------------------------------
date1 | 1000 | ItemNumber | 20.1A14
date1 | 1000 | ItemRev | 2
date1 | 1000 | BarCodeNumber | 3854981
date2 | 1001 | ItemNumber | 20.1B24
date2 | 1001 | ItemRev | 1
date2 | 1001 | BarCodeNumber | 3856539
我想要做的是将所有 PROPERTYNAME 列值转换为单独的列,并将它们各自的 PROPERTYVALUE 列值转换为各自的列,如下所示:
INSERTDATE | ID | ItemNumber | ItemRev | BarCodeNumber
-------------------------------------------------------
date1 | 1000 | 20.1A14 | 2 | 3854981
date2 | 1001 | 20.1B24 | 1 | 3856539
几天来我一直试图解决这个问题,但没有任何结果。我在互联网上查找了 Pivot 上的所有内容,但没有一个示例符合我自己的需求。我对 SQL 中的 Pivot 不太熟悉,所以如果有人能帮助我弄清楚如何使用它来解决我的问题,那将非常有帮助。
解决方案
如果你知道你想要的列,你可以使用条件聚合:
select insertdate, id,
max(case when PROPERTYNAME = 'ItemNumber' then propertyvalue end) as ItemNumber,
max(case when PROPERTYNAME = 'ItemRev' then propertyvalue end) as ItemRev,
max(case when PROPERTYNAME = 'BarCodeNumber' then propertyvalue end) as BarCodeNumber
from t
group by insertdate, id;
如果您事先不知道所有属性,则需要将查询动态构造为字符串并使用execute immediate
.
推荐阅读
- javascript - 如何将cshtml文件的脚本标签中的变量传递给另一个javascript文件?
- angular - 如何从角度 11 中的 http 登录响应中获取 cookie?
- symfony - Symfony:Twig 中的多个“for”循环
- git - 删除一些提交,但保留更改
- python-3.x - 如何分离图形的图像?
- javascript - 轻量级图表不显示 y 轴
- firebase - 如何将电话号码链接到已经登录的firebase gmail用户
- javascript - Node js - 页面渲染发生在数据库更新之前
- reactjs - 如何禁用断线更漂亮
- unit-testing - 开玩笑 - 从测试跳回模块代码