2013-12-11 43 views
1

我一直在研究一个'简单'问题整天,它让我发疯。我确信我错过了一些明显的东西;然而,没有多少搜索帮助我。TSQL'查找'功能 - 困惑

我有1行数据表,如; (Table_1)

   Person_1   Person_2   Person_3 
PersonID  ABC    DEF    GHI 

但是我需要用另一个表中的值替换引用,但与ID列匹配,例如; (表2)

PersonID  Work_Done 
    LMN   298 
    GHI   187 
    ABC   872 
    XYZ   468 
    DEF   512 

因此返回;

   Person_1   Person_2   Person_3 
Work_Done  872    512    187 

我正在使用Microsoft SQL Server企业版V8.00.2039,我无法控制我的源表。

任何帮助(即使只是想什么谷歌)将非常感激。

用于生成示例表的SQL;

-- Table_1 
SELECT 
'ABC' AS Person_1, 
'DEF' AS Person_2, 
'GHI' AS Person_3 
; 
-- Table_2 
SELECT 'LMN' AS Person_ID, 298 AS Work_Done 
UNION ALL 
SELECT 'GHI' AS Person_ID, 187 AS Work_Done 
UNION ALL 
SELECT 'ABC' AS Person_ID, 872 AS Work_Done 
UNION ALL 
SELECT 'XYZ' AS Person_ID, 468 AS Work_Done 
UNION ALL 
SELECT 'DEF' AS Person_ID, 512 AS Work_Done 
; 
--Returning 
SELECT 
'872' AS Person_1, 
'512' AS Person_2, 
'187' AS Person_3; 
+1

(1)TABLE_1似乎混淆行/列。 (2)最后给出的sql不会创建表。我可以告诉你,你正在寻找一个加入,但恐怕这可能没有足够的帮助。看看一个SQL教程,例如。 http://www.w3schools.com/sql/ – thebjorn

回答

1

既然你不能改变设计,这里的检索你想要的代码:

SELECT Person_1 = a.Work_Done 
, Person_2 = b.Work_Done 
, Person_3 = c.Work_Done 
FROM Table1 t 
    JOIN Table2 a ON t.Person_1 = a.Person_ID 
    JOIN Table2 b ON t.Person_2 = b.Person_ID 
    JOIN Table2 c ON t.Person_3 = c.Person_ID 

多加入到同一个表的别名(表2)

+0

好又简单,虽然实际的数据表有9列,所以我需要9个连接。 –

0
SELECT * 
FROM 
(
    SELECT unpvt.Person_Type, b.Work_Done 
    FROM Table_1 a 
    UNPIVOT (Person_ID FOR Person_Type IN (a.[Person_1], a.[Person_2], a.[Person_3])) unpvt 
    JOIN Table_2 b ON unpvt.Person_ID = b.Person_ID 
) c 
PIVOT (MAX(c.Work_Done) FOR c.Person_Type IN ([Person_1], [Person_2], [Person_3])) pvt 

SQL Fiddle

0

DO PIVOT
http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

请注意,你需要的,如果你想有不同的组合

使用嵌入式SQL和EXEC @sql请注意,在PERSON_ID IN([ABC],[DEF],[LMN] [GHI],[XYZ])
[ABC]是表的需要,当你做你@sql要小心'撇号科拉姆

SELECT 
    * 
FROM(

SELECT 'LMN' AS Person_ID, 298 AS Work_Done 
UNION ALL 
SELECT 'GHI' AS Person_ID, 187 AS Work_Done 
UNION ALL 
SELECT 'ABC' AS Person_ID, 872 AS Work_Done 
UNION ALL 
SELECT 'XYZ' AS Person_ID, 468 AS Work_Done 
UNION ALL 
SELECT 'DEF' AS Person_ID, 512 AS Work_Done 


) as datasourcetable 
PIVOT 
(
SUM(Work_Done) 
FOR Person_ID IN ([ABC], [DEF],[LMN],[GHI],[XYZ]) 

) AS PivotTable;