2016-12-27 7 views
2

Ich mag zwei Tabellen verknüpfen und sie miteinander zu kombinieren, aber Problem ist eine Tabelle im Querformat ist anderes ist in vertikalenJoin Zwei Tabellen mit Dynamic Pivot-Abfrage

Im Folgenden sind Tabellenstrukturen Tabelle 1:

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 

Tabelle 2:

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

gewünschte Ausgabe:

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 

Ich hatte versucht, mit Pivot-Abfrage, aber es funktioniert nicht wie erwartet.

+0

plz umfassen die Abfrage, was Sie bisher versucht hatte? –

+0

Verbinden Sie den ersten Tisch mit einem zweiten. – Serg

+0

@AbdulRasheed tatsächlich beide Tabellenausgabe sind dynamische Abfrage http://stackoverflow.com/questions/41330029/combine-two-dynamic-queries-into-one-dynamic-query-using-pivot aber ich bin nicht in der Lage, dynamisch beizutreten zwei Abfragen in eine – Nilesh

Antwort

1

Sie haben, wie unten dynamische Abfrage verwendet werden, und Sie können sich testen, indem mehr Zugabe FieldName s

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) 

AUSGABE:

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 
+0

Dank es funktionierte wie erwartet – Nilesh

0

Versuchen Sie folgendes:

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; 
+0

Spaltenname sind dynamisch, wie kann ich Case-Anweisung dynamisch machen, in Tabelle 2 Werte sind nicht fest – Nilesh

+0

Es ist kein großartiges Design, eine variable Anzahl von Spalten im Ergebnis zu haben. – GurV

+1

das ist die Voraussetzung, mehrere Werte zu haben, sie können nicht statisch sein – Nilesh

1
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 

Jetzt temporäre Tabelle beitreten und Tabelle 1.

1

versuchen, dieses adaequat

;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 

OutPut:

enter image description here