【问题标题】:join with pivot table加入数据透视表
【发布时间】:2013-10-15 19:52:26
【问题描述】:

我有两张像 t1 和 t2 一样的表。 t1

ID                          class name
--                          -----------
1                            basket weaving
2                            Underwater Basketing

t2
ID                            POS     DAYS
--                            ----    -----
1                              1      M
1                              2      T
1                              3      W
1                              4     TH
1                              5      F
2                              1      M
2                              2      W
2                              3      F

我想从两个表中获得以下输出。

1                             class                  DAYS
--                            -----                  -----
1                             BASKET WEAVING         MTWTHF
2                             Underwater basketing   MWF

【问题讨论】:

    标签: sql-server sql-server-2008 sql-server-2012


    【解决方案1】:

    查询1

    SELECT ID, [class name], STUFF(List, 1 ,2, '') [DAYS]
        FROM Table1 T1 CROSS APPLY 
                                (
                                SELECT ', ' + [DAYS] [text()]
                                FROM Table2
                                WHERE ID = T1.ID
                                FOR XML PATH('')
                                ) T2(List)
    

    结果

    ID                            class name             DAYS
    --                            -----                  -----
    1                             BASKET WEAVING         M,T,W,TH,F
    2                             Underwater basketing   M,W,F
    

    它会给你一个逗号分隔的日期列表,如果你想要没有逗号,你可以使用以下
    Query2

    SELECT ID, [class name], List [DAYS]
    FROM Table1 T1 CROSS APPLY 
                            (
                            SELECT  [DAYS] [text()]
                            FROM Table2
                            WHERE ID = T1.ID
                            FOR XML PATH('')
                            ) T2(List)
    

    结果

    ID                            class name             DAYS
    --                            -----                  -----
    1                             BASKET WEAVING         MTWTHF
    2                             Underwater basketing   MWF
    

    查询3

    SELECT ID, [class name], STUFF(List, 1 ,2, '') [DAYS], STUFF(T3.Rooms, 1 ,2, '') [Rooms]
    FROM Table1 T1 CROSS APPLY 
                                (
                                SELECT ', ' + [DAYS] [text()]
                                FROM Table2
                                WHERE ID = T1.ID
                                FOR XML PATH('')
                                ) T2(List)
                   CROSS APPLY 
                            (
                            SELECT '/' + Rooms [text()]
                            FROM Table2
                            WHERE ID = T1.ID
                            FOR XML PATH('')
                            ) T3(Rooms)
    

    您可以通过执行类似的操作来添加另一列.....

    【讨论】:

    • 这样做可以返回更多。例如,如果我在 t2 中添加了第四列,称为 rooms 我想返回以下 1 BASKET WEAVING MTWTHF 103/104/105/106/107
    • 我添加了另一个查询,第三列添加了房间,希望这会有所帮助。
    【解决方案2】:

    在跨已知区间聚合某些值时,您可能希望使用数据透视表。如果您想要一个包含值组合的字段,我建议您使用 FOR XML PATH。使用 pivot 的输出如下所示:

    Class ID   Class Name    Monday    Tuesday    Wednesday    Thursday   Friday...
    1          Class 1       1         1          1            0          0
    2          Class 2       0         0          0            1          0        
    

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      相关资源
      最近更新 更多