sql将表的问题列值透视到多个列中

wydwbb8l  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(340)

关于这个问题,我有一个问题,我想不通。
我试着将下面的值作为轴心,这里是一些示例数据。

Line  ID   Password
1       C1    Llama
1       C1    Elbow
1       C1    TV
2       C2    Password

变成这样。我能做的最大列数可以限制为15或10。

Line    ID    Password1   Password2    Password3
1         C1      Llama      Elbow        TV
2         C2      Password   BLANK/NULL   BLANK/NULL

我在下面的几次迭代中尝试过类似的东西

SELECT ID, [1], [2], [3] FROM (
SELECT * exampletable) AS T
PIVOT (MAX(PASSWORD) FOR Line IN ([1], [2], [3])) AS PVT
i2byvkas

i2byvkas1#

我建议使用窗口函数和条件聚合。如果您有一个定义记录顺序的列,那么这就更有意义了——我假设是这样的 ordering_id .

select
    line,
    id,
    max(case when rn = 1 then password end) password1,
    max(case when rn = 2 then password end) password1,
    max(case when rn = 3 then password end) password3
from (
    select t.*, row_number() over(partition by line, id order by ordering_id) rn
    from mytable t
) t
group by line, id

您可以扩展 select 外部查询的子句,以根据需要处理更多可能的值 (line, id) 元组。

pgvzfuti

pgvzfuti2#

如果有一个动态的密码数,那么代码应该动态匹配。
缺少数据透视的枚举。

with t as(
select*from(values
(1,'Llama'),
(1,'Elbow'),
(1,'TV'),
(2,'Password'))a(ID,Password)
), RunningNums as(
select *, ROW_NUMBER() over (partition by ID order by ID)RN from t
)
SELECT ID, [1], [2], [3]
FROM (
    SELECT *
    FROM RunningNums
) AS SourceTable
PIVOT(
    max(Password)
    FOR RN IN ([1], [2], [3])
)as P

相关问题