2016-12-27 3 views
2

Je veux joindre deux tables et les combiner en un seul mais le problème est une table est au format horizontal autre est à la verticaleJoignez-vous à deux tables à l'aide dynamique Pivot requêtes

Ci-dessous sont des structures de table Tableau 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 

Tableau 2:

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

sortie désiré:

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 

J'avais essayé d'utiliser la requête Pivot mais cela ne fonctionne pas comme prévu.

+0

plz inclut la requête ce que vous aviez essayé jusqu'à présent? –

+0

Joindre la première table avec un deuxième pivoté. – Serg

+0

@AbdulRasheed en réalité les deux la sortie de la table sont de requête dynamique http://stackoverflow.com/questions/41330029/combine-two-dynamic-queries-into-one-dynamic-query-using-pivot mais je ne suis pas capable de rejoindre dynamiquement deux requêtes en un – Nilesh

Répondre

1

Vous devez utiliser requête dynamique comme ci-dessous et vous pouvez tester est en ajoutant plus de 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) 

OUTPUT:

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

merci cela a fonctionné comme prévu – Nilesh

0

Essayez ceci:

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

Le nom de la colonne est dynamique, donc comment puis-je rendre l'instruction de requête dynamique, dans la table 2 les valeurs ne sont pas fixes – Nilesh

+0

Ce n'est pas une bonne idée d'avoir un nombre variable de colonnes dans le résultat. – GurV

+1

c'est l'exigence d'avoir plusieurs valeurs, ils ne peuvent pas être statiques – 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 

maintenant se joindre à la table temporaire et une table 1.

1

essayer ce fonctionne bien

;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