【问题标题】:Join Two tables using Dynamic Pivot Query使用动态数据透视查询连接两个表
【发布时间】:2017-05-11 13:30:34
【问题描述】:

我想将两张表合并为一张,但问题是一张表是水平格式,另一张是垂直格式

以下是表结构 表一:

EmpID |  Code |  Name | Fld1  | Fld2  | Fld3  | Fld4 
--    |----   | ------|  ---  | ----  |----   |----  
1     | 1008M | ABC   | temp1 | temp2 | temp3 | null
2     | 1039E | XYZ   | temp1 | null  | null  | null
3     | 1040E | TYS   | null  | null  | null  | temp6

表 2:

EmpID |  FieldName |  Value
--    |----        | ------
1     | FH         | 1000  
1     | FB         | 1220  
2     | FHRA       | 3000  
2     | FB         | 3000  
3     | FB         | 3000  

期望的输出:

EmpID |  Code |  Name | Fld1  | Fld2  | Fld3  | Fld4 | FH  | FB | FHRA
--    |----   | ------|  ---  | ----  |----   |----  | --- |--- | ----
1     | 1008M | ABC   | temp1 | temp2 | temp3 | null |1000 |1210| 0  
2     | 1039E | XYZ   | temp1 | null  | null  | null |0    |3000| 3000   
3     | 1040E | TYS   | null  | null  | null  | temp6|0    |3000| 0   

我曾尝试使用 Pivot 查询,但它没有按预期工作。

【问题讨论】:

  • 请包含您到目前为止尝试过的查询?
  • 将第一个表与旋转的第二个表连接起来。
  • @AbdulRasheed 实际上两个表输出都是动态查询stackoverflow.com/questions/41330029/… 但我无法动态地将两个查询合并为一个
  • @Nilesh 你能在下面查看我的答案吗?

标签: c# sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

您必须使用如下动态查询,您可以通过添加更多FieldNames 来测试

CREATE TABLE #table1(EmpID INT,  
    Code VARCHAR(20),  
    Name VARCHAR(20), 
    Fld1 VARCHAR(20), 
    Fld2  VARCHAR(20), 
    Fld3  VARCHAR(20), 
    Fld4 VARCHAR(20))

INSERT INTO #table1 VALUES 
(1,     '1008M','ABC','temp1','temp2','temp3',NULL),
(2,     '1039E','XYZ','temp1',NULL,NULL,null),
(3,     '1040E','TYS',null,NULL,NULL,'temp6')

CREATE TABLE #table2(EmpID INT,  FieldName VARCHAR(20),  VALUE INT)
INSERT INTO #table2 VALUES 
(1,'FH',1000),  
(1,'FB',1220),  
(2,'FHRA',3000),  
(2,'FB',3000),  
(3,'FB',3000)

DECLARE @col VARCHAR(MAX)
DECLARE @sql VARCHAR(MAX)

SELECT @col = COALESCE(@col + ', ','') + QUOTENAME(FieldName)
FROM #table2 GROUP BY FieldName

SELECT @col -- This gives: [FB], [FH], [FHRA]

-- Now setting this @col variable in the Dynamic SQL.
SET @sql = '
select EmpID, Code, Name,Fld1,Fld2,Fld3,Fld4, ' + @col + '
from (select a.EmpID, Code, Name,Fld1,Fld2,Fld3,Fld4, b.FieldName, b.value
        from #table1 a 
        join #table2 b on a.empid=b.empid)p
PIVOT(MAX (VALUE) FOR FieldName IN ( ' + @col + ' )
) AS pvt
'

PRINT @sql
EXEC (@sql)

输出

EmpID   Code    Name    Fld1    Fld2    Fld3    Fld4    FB      FH      FHRA
1       1008M   ABC     temp1   temp2   temp3   NULL    1220    1000    NULL
2       1039E   XYZ     temp1   NULL    NULL    NULL    3000    NULL    3000
3       1040E   TYS     NULL    NULL    NULL    temp6   3000    NULL    NULL

【讨论】:

    【解决方案2】:

    试试这个工作正常

        ;with demo1 as (
        select * from Table_1
        ), a as
        (
         SELECT *
        FROM Table_2
        PIVOT(SUM(value) 
              FOR Fieldname IN (FH, FB,FHRA)) AS PVTTable
    
        )select demo1.EmpID,demo1.Code,demo1.Name,demo1.Fld1,demo1.Fld2,demo1.Fld3,demo1.Fld4,a.FH,a.FB,a.FHRA 
         from a inner join demo1 on a.EmpID=demo1.EmpID
    

    输出:

    【讨论】:

      【解决方案3】:
      declare @temp table(empid int,fh int,fb int, fhra int)
      insert into @temp
      SELECT *
      FROM (
          SELECT 
             empid,fieldname as [field],value as val
          FROM dbo.emp
      ) as s
      PIVOT
      (
         min( val)
          FOR [field] IN (fh,fb,fhra)
      )AS pvt
      
      select * from @temp join table1
      

      现在加入临时表和表 1。

      【讨论】:

        【解决方案4】:

        试试这个:

        select t1.empid,
            t1.code,
            t1.fld1,
            t1.fld2,
            t1.fld3,
            t1.fld4,
            sum(case when t2.fieldname = 'FH' then t2.value else 0 end) FH,
            sum(case when t2.fieldname = 'FB' then t2.value else 0 end) FB,
            sum(case when t2.fieldname = 'FHRA' then t2.value else 0 end) FHRA
        from table1 t1
        left outer join table2 t2
        on t1.empid = t2.empid
        group by t1.empid,
            t1.code,
            t1.fld1,
            t1.fld2,
            t1.fld3,
            t1.fld4;
        

        【讨论】:

        • 列名是动态的,所以我怎样才能使 case 语句动态,表 2 中的值不固定
        • 在结果中包含可变数量的列并不是一个很好的设计。
        • 要求有多个值,不能是静态的
        猜你喜欢
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多