【问题标题】:dynamic pivot for resultset结果集的动态枢轴
【发布时间】:2020-03-06 12:39:59
【问题描述】:

我正在寻找一种有效的方法来构建以下结果集。有人知道我该如何开始。 我不知道开始。阅读有关枢轴但不知道的内容。 问题是 Table 中的行是无限的,这意味着我不知道必须显示多少列。

Table1
--------------
|ID1  | Name1| 
--------------
| 1   | Name1|
| 2   | Name2|
| 3   | Name3|

Table 2
--------------------
|ID2  | Name2| Use |
--------------------
| 1   | xyz1 |True |
| 2   | xyz2 |False|
| 3   | xyz3 |True |
| 4   | xyz4 |True |
Table3
--------------------
|ID_3|FK_ID1 |FK_ID2|
| 1  | 1     | 1    |
| 3  | 3     | 1    |
| 4  | 1     | 3    |
| 5  | 2     | 3    |

Resultset
---------------------------------
ID1 | Name1 | xyz1| xyz3 | xyz4 |
-------------------------- 
1   | Name1 | True|True  | False|
2   | Name2 |False| True | False|
3   | Name3 | True|False | False|

【问题讨论】:

    标签: sql sql-server tsql group-by pivot


    【解决方案1】:

    要在列的固定列表上进行透视,您可以进行条件聚合:

    select 
        t1.id1,
        t1.name1,
        max(case when t2.name2 = 'xyz1' then t2.use else 'False' end) xyz1,
        max(case when t2.name2 = 'xyz3' then t2.use else 'False' end) xyz3,
        max(case when t2.name2 = 'xyz4' then t2.use else 'False' end) xyz4
    from table1 t1
    inner join table3 t3 on t3.fk_id1 = t1.id1
    inner join table2 t2 on t2.id2 = t3.fk_id2
    where t2.name2 in ('xyz1', 'xyz3', 'xyz4')
    group by t1.id1, t1.name1
    

    【讨论】:

    • 在表二中可以有无限多的数据记录。我必须将它们全部输出为列。那是我的问题。它必须是动态的。
    • @battleboimatze:您可能应该首先提到这一点。动态透视需要动态 SQL,这是一种不同的野兽。您可以搜索诸如 sql-server dynamic pivot 之类的内容以获取有关如何继续的示例。
    • 对此感到抱歉。但我不明白如何将它与其他表一起使用
    【解决方案2】:

    这看起来像 join 和聚合:

    select t1.id, t1.name,
           max(case when t2.name2 = 'xyz1' then t2.use else 'false' end) as xyz1,
           max(case when t2.name2 = 'xyz2' then t2.use else 'false' end) as xyz2,
           max(case when t2.name2 = 'xyz3' then t2.use else 'false' end) as xyz3
    from table3 t3 join
         table1 t1 
         on t3.fk_id1 = t1.id join
         table2 t2
         on t3.fk_id2 = t2.id
    group by t1.id, t1.name;
    

    【讨论】:

    • 在表二中可以有无限多的数据记录。我必须将它们全部输出为列。那是我的问题。它必须是动态的。
    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多