将行转换为列 Oracle SQL
Pivoting rows into columns Oracle SQL
我目前正在研究一个 table,其中 table 的格式是这样的(所有列都是 VARCHAR 类型,除了 DATE 类型的 INSERTDATE 列):
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 上的所有内容,但 none 个示例符合我自己的需要。我对 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;
如果您不知道所有属性 up-front,那么您需要将查询动态构造为字符串并使用 execute immediate
.
该用例是 PIVOT
的合适候选者,您可以在这里完美地使用它。
假设您使用 Oracle
作为数据库,查询将如下所示,
select insertdate,id,ItemNumber,ItemRev,BarCodeNumber
from mytable
pivot
(
max(propertyvalue)
for propertyname in ('ItemNumber' as ItemNumber
,'ItemRev' ItemRev
,'BarCodeNumber' BarCodeNumber)
)
order by insertdate;
我目前正在研究一个 table,其中 table 的格式是这样的(所有列都是 VARCHAR 类型,除了 DATE 类型的 INSERTDATE 列):
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 上的所有内容,但 none 个示例符合我自己的需要。我对 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;
如果您不知道所有属性 up-front,那么您需要将查询动态构造为字符串并使用 execute immediate
.
该用例是 PIVOT
的合适候选者,您可以在这里完美地使用它。
假设您使用 Oracle
作为数据库,查询将如下所示,
select insertdate,id,ItemNumber,ItemRev,BarCodeNumber
from mytable
pivot
(
max(propertyvalue)
for propertyname in ('ItemNumber' as ItemNumber
,'ItemRev' ItemRev
,'BarCodeNumber' BarCodeNumber)
)
order by insertdate;