【问题标题】:Crosstab/Pivot query in TSQL on nvarchar columnsvarchar 列上 SQL 中的交叉表/数据透视查询
【发布时间】:2011-04-03 12:43:42
【问题描述】:

我有一个 Table1:

ID  Property
1   Name
2   City
3   Designation

和表2:

ID  RecordID  Table1ID  Value
1   1         1         David
2   1         2         Tokyo
3   2         1         Scott
4   2         3         Manager

Table2 的 Table1ID 映射到 Table1 的 ID。现在我希望将 Table1 属性列值显示为列标题,并以如下格式设置结果:

RecordID     Name    City    Designation
1            David   Tokyo   NULL
2            Scott   NULL    Manager

在 T-SQL 中实现此目的的最佳/有效方法是什么考虑到 Table1 中的记录数(即结果集中的列)可能会发生变化,因此应该动态处理

虽然我尝试过基于 PIVOT 和 CASE 的查询,但一直在努力解决这两个问题。 :(

任何帮助/指导将不胜感激。

谢谢!

更新:
我已经能够创建动态查询,但我仍然无法理解的一件事是为什么在 CASE 语句中使用了 MAX。请忽略我的菜鸟。

【问题讨论】:

    标签: sql sql-server-2005 tsql pivot dynamic-pivot


    【解决方案1】:

    用途:

      SELECT t2.recordid,
             MAX(CASE WHEN t1.property = 'Name' THEN t2.value END) AS name,
             MAX(CASE WHEN t1.property = 'City' THEN t2.value END) AS city,
             MAX(CASE WHEN t1.property = 'Designation' THEN t2.value END) AS designation
        FROM TABLE2 t2
        JOIN TABLE1 t1 ON t1.id = t2.table1id
    GROUP BY t2.recordid
    ORDER BY t2.recordid
    

    【讨论】:

    • ^^ 太好了!只有两个问题: 1. 为什么使用聚合 fn。每个案例的最大值? 2. 当t1.Property中的条目数可以改变时,如何动态处理CASE语句?非常感谢您的帮助!
    • +1 - 对于这类问题,在我看来,这最好是 PIVOT - 我永远不会记住 PIVOT 的语法。 :)
    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多