2013-12-11 45 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;