【问题标题】:SQL Pivot Table Question Column Values into Multiple ColumnsSQL 数据透视表问题列值分成多列
【发布时间】:2020-07-25 22:36:20
【问题描述】:

我有一个关于这个查询的问题,我似乎无法弄清楚。

我正在尝试调整以下值,这是一些示例数据。

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

【问题讨论】:

    标签: sql tsql sql-server-2008 pivot window-functions


    【解决方案1】:

    我会推荐窗口函数和条件聚合。如果您有一个定义记录顺序的列,这更有意义 - 我假设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) 元组的更多可能值。

    【讨论】:

    • 非常感谢,我知道有更简单的方法,但不知道如何去做。你为我节省了很多时间!现在我可以享受我的周末了:)
    【解决方案2】:

    如果密码数量是动态的,那么代码应该动态匹配。

    您缺少 PIVOT 的枚举。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多