如何使用UNION ALL透视查询

时间:2014-12-12 09:33:51

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

我有以下表结构&下面是我正在执行的查询: -

以下表格: -

第一张表: -

enter image description here

第二张表: -

enter image description here

SELECT Code, Fname, OTHINC1, OTHINC2
FROM (SELECT a.FieldName
            ,a.YearlyValue
            ,b.Code
            ,b.Fname
      FROM [TaxOtherIncome] AS a
      INNER JOIN [EmployeeDetail] AS b
         ON a.EmployeeId = b.Id
      WHERE a.EntryDate = '2014-12-01') x
      PIVOT (MAX(YearlyValue) FOR FieldName IN (OTHINC1,OTHINC2)) p

我得到的结果: -

enter image description here

我也想要上面提到的第二张表中的记录。所以在我的最终结果列SUBFLD36SUBFLD37&将添加House_Rent

由于我是Pivot的新手,请帮助我修改上述查询以获得预期的结果。

2 个答案:

答案 0 :(得分:3)

考虑您将联接后的结果插入到下面的临时表

enter image description here

声明用于获取要转动的列的变量

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + [FIELD NAME] + ']', 
               '[' + [FIELD NAME] + ']')
               FROM    (SELECT DISTINCT [FIELD NAME] FROM #TEMP) PV  
               ORDER BY [FIELD NAME]

现在转动它

DECLARE @query NVARCHAR(MAX)
    SET @query = '           
                  SELECT * FROM 
                 (
                     SELECT * FROM #TEMP
                 ) x
                 PIVOT 
                 (
                     MAX([YEARLY VALUE])
                     FOR [FIELD NAME] IN (' + @cols + ')
                ) p      

                '     
    EXEC SP_EXECUTESQL @query

Click here to view the result

<强> RESULT

enter image description here

答案 1 :(得分:2)

你可以试试这个:

SELECT Code, Fname, OTHINC1, OTHINC2, SUBFLD36, SUBFLD37, House_Rent
FROM (SELECT a.FieldName
            ,a.YearlyValue
            ,b.Code
            ,b.Fname
      FROM [TaxOtherIncome] AS a
      INNER JOIN [EmployeeDetail] AS b
         ON a.EmployeeId = b.Id
      WHERE a.EntryDate = '2014-12-01'
      UNION
      SELECT a.FieldName
            ,a.FieldValue AS YearlyValue
            ,a.EmployeeCode AS Code
            ,b.Fname
      FROM SecondTable AS a
      INNER JOIN [EmployeeDetail] AS b
         ON a.EmployeeId = b.Id
      WHERE EntryDate = '2014-12-01') x
      PIVOT (MAX(YearlyValue) FOR FieldName IN (OTHINC1, OTHINC2, SUBFLD36, SUBFLD37, House_Rent)) p