【问题标题】:SQL Server - Join a selection of columns from a Dynamically Pivoted TableSQL Server - 加入动态透视表中的选择列
【发布时间】:2018-05-08 09:57:05
【问题描述】:

我尝试动态旋转表 PMESATOVERVIEW 并将其连接到 PMEOBJECT 另一个表,代码如下。但是我想从透视表中删除某些列。

SQL 示例:http://rextester.com/DKHF52968

首先我将描述数据示例:

PMEOBJECT
ObjectId, Location,
1, North
2, South
3, West
4, East

并内连接该表的旋转版本:

PMESATOVERVIEW
ObjectId, AttributeCat, AttributeId, Value
1, WW, Surface, 40
1, XX, Date, 1-1-2017
1, WW, Energy Label, B
2, WW, Surface, 45
2, XX, Date, 3-5-2017
3, WW, Surface, 50
3, WW, Energy Label, A
4, WW, Surface, 50
4, XX, Date, 1-4-2018
4, WW, Energy Label, A+

使用以下代码:

DECLARE @colsValues 

AS NVARCHAR(max) = Stuff(
(SELECT DISTINCT ',' + 
    Quotename(fat.ATTRIBUTEID)
     FROM   PMESATOVERVIEW fat
     FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

DECLARE @query AS NVARCHAR(max) =  
                                'SELECT    *
                                  FROM       (SELECT *
                                              FROM   PMESATOVERVIEW
                                              PIVOT(Max(VALUE)
                                              FOR ATTRIBUTEID IN ('+ 
@colsValues +')) piv) fat
                                  INNER JOIN PMEOBJECT tb
                                  ON          tb.OBJECTID = fat.OBJECTID';
EXECUTE(@query)

这段代码没有错误,但我得到的结果是:

PMESATOVERVIEW
ObjectId    AttributeCat    Date    Energy Label    Surface ObjectId    Location
1   WW  NULL        C       40      1   North
2   WW  NULL        B       40      2   West
3   WW  NULL        A+      45      3   South
4   WW  NULL        NULL    50      4   East
1   XX  1-1-2017    NULL    NULL    1   North
2   XX  3-4-2017    NULL    NULL    2   West
4   XX  1-5-2018    NULL    NULL    4   East

而我想要的是:

ObjectId    Date    Energy Label    Surface ObjectId    Location
1   1-1-2017    C       40  1   North
2   3-4-2017    B       40  2   West
3   NULL        A+      45  3   South
4   1-5-2018    NULL    50  4   East

SQL语句结果:http://rextester.com/DKHF52968

任何想法如何做到这一点? 我尝试在 Pivot 语句中仅选择几列,但不知何故它无法识别 ObjectId、AttributeId 和 Value。

对此有何想法?

亲切的问候, 伊戈尔

【问题讨论】:

    标签: select dynamic pivot-table multiple-columns


    【解决方案1】:

    通过执行类似操作,您可以获得预期的输出。 但是,可能有更好的方法来做到这一点。

    DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename(AttributeId) 
             FROM   PMESATOVERVIEW       
             FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 
    
    DECLARE @maxCols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', max(' + Quotename(AttributeId) + ') as ' + Quotename(AttributeId)
             FROM   PMESATOVERVIEW       
             FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 
    
    DECLARE @query AS NVARCHAR(max) =  'SELECT     fat.ObjectId, '+@maxCols+',  max(tb.location) as Location 
                                        FROM       (SELECT ObjectId, '+ @cols +'
                                                    FROM   PMESATOVERVIEW 
                                                    PIVOT(Max(Value) FOR AttributeId IN ('+ @cols +')) piv) fat
                                        INNER JOIN PMEOBJECT tb 
                                        ON         tb.ObjectId = fat.ObjectId 
                                        group by   fat.ObjectId';
    
    EXECUTE(@query) 
    

    输出

    +----------+----------+--------------+---------+----------+
    | ObjectId |   Date   | Energy Label | Surface | Location |
    +----------+----------+--------------+---------+----------+
    |        1 | 1-1-2017 | C            |      40 | North    |
    |        2 | 3-4-2017 | B            |      40 | West     |
    |        3 | NULL     | A+           |      45 | South    |
    |        4 | 1-5-2018 | NULL         |      50 | East     |
    +----------+----------+--------------+---------+----------+
    

    在线演示:http://rextester.com/GVY57614

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 2010-11-29
      • 2013-09-10
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2013-02-09
      相关资源
      最近更新 更多