2013-10-07 170 views
0

由於標題不是很具描述性,所以我很抱歉。將表格合併到新表格中,同時保留信息

我有大約40+表,每個具有相同的確切的表格佈局列和數據保存爲一列。我想把所有表格中不同的列合併成一個表格。混亂?讓我說明..

SRCTbl01:

ID TYPE COLR1 INSTOCK 
----------------------- 
1 B  RED YES 
2 B  BLUE YES 
3 P  GREEN NO 
4 B  BLACK YES 

SRCTbl02:

ID TYPE COLR1 INSTOCK 
----------------------- 
1 B  RED YES 
2 B  BLUE NO 
3 P  GREEN YES 
4 B  BLACK YES 

SRCTbl03:

ID TYPE COLR1 INSTOCK 
----------------------- 
1 B  RED YES 
2 B  BLUE NO 
3 P  GREEN NO 
4 B  BLACK NO 

結果:(要排除P型)

ID TYPE COLR1 SRCTbl01 SRCTbl02 SRCTbl03 
---------------------------------------------- 
1 B  RED YES  YES  YES 
2 B  BLUE YES  NO  NO 
4 B  BLACK YES  YES  NO 

最後畢竟,我想使表看起來像這樣:

INSTOCK表:

Customer RED BLUE BLACK 
--------------------------- 
SRCTbl1 YES YES YES 
SRCTbl2 YES NO YES 
SRCTbl3 YES NO NO 

我不能完全肯定我是否可以直接操作表到期待就像最後一次迭代一樣,所以我想我應該問如何讓它達到第一個結果,對我來說這似乎更簡單。

謝謝你的幫助,我已經花了整整8個小時的時間,還沒有找到辦法實現它,所以我來這裏問專家。

編輯:澄清,我已經在實現上述結果零成功。我試過使用SELECT .. Union SELECT和FULL JOINS。

使用此代碼導致重複(我試圖剛剛拿到INSTOCK)

SELECT 01.INSTOCK, 02.INSTOCK, 03.INSTOCK 
FROM dbo.SRCTbl01 AS 01, dbo.SRCTbl02 AS 02, dbo.SRCTbl03 AS 03 
WHERE 01.TYPE='B' 

我試過很多,但是這可能是我最接近的一次。

+0

你應該張貼您以前解決問題,否則您的問題將可能封閉,*題外話*的嘗試。 「詢問代碼的問題必須表明對所解決問題的最小理解,包括嘗試的解決方案,爲什麼他們不工作,以及預期的結果」 – zero323

+0

您能澄清 - 您實際上並不需要RESULT嗎? – zero323

+0

那麼我想要的最後一張桌子就是最後一張桌子,但我認爲我需要在能夠進入決賽桌之前進入RESULT。我正在嘗試拉斐爾和丹目前提供的樣本。 – HexEDSyght

回答

1

你可以做這樣的事情,都在同一個:

你先與工會壓平,然後採取最大「的inStock」爲每種顏色由客戶(MAX將作爲「YES」>「NO」)

select Customer, MAX(RED) as RED, MAX(BLUE) as BLUE, MAX(BLACK) as BLACK 
FROM(
    SELECT 'SRCTbl01' as Customer, 
     CASE WHEN COLR1 = 'RED' then INSTOCK ELSE 'NO' END as RED, 
     CASE WHEN COLR1 = 'BLUE' then INSTOCK ELSE 'NO' END as BLUE, 
     CASE WHEN COLR1 = 'BLACK' then INSTOCK ELSE 'NO' END as BLACK 
    FROM SRCTbl01 
    WHERE Type <> 'P' 
UNION 
    SELECT 'SRCTbl02' as Customer, 
     CASE WHEN COLR1 = 'RED' then INSTOCK ELSE 'NO' END as RED, 
     CASE WHEN COLR1 = 'BLUE' then INSTOCK ELSE 'NO' END as BLUE, 
     CASE WHEN COLR1 = 'BLACK' then INSTOCK ELSE 'NO' END as BLACK 
    FROM SRCTbl02 
    WHERE Type <> 'P' 
UNION 
    SELECT 'SRCTbl03' as Customer, 
     CASE WHEN COLR1 = 'RED' then INSTOCK ELSE 'NO' END as RED, 
     CASE WHEN COLR1 = 'BLUE' then INSTOCK ELSE 'NO' END as BLUE, 
     CASE WHEN COLR1 = 'BLACK' then INSTOCK ELSE 'NO' END as BLACK 
    FROM SRCTbl03 
    WHERE Type <> 'P' 
) as a 
GROUP BY Customer 

(你只需要添加一個CREATE TABLE INSTOCK as <codegiven>

看到SqlFiddle

+0

非常感謝你的幫助。出於某種原因,INSTOCk已被定義爲這樣一個位,因此我必須使用CAST(RED AS tinyint)並將「NO」更改爲0.它非常接近結果!非常感謝。我會試着弄清楚爲什麼列名不會出現,並會發布最終的迭代。 – HexEDSyght

+0

@HexEDSyght列名不會出現:只使用別名:MAX(RED)作爲RED,MAX(BLUE)作爲BLUE等。請參閱編輯答案。 –

+0

謝謝!我正在測試它在我的服務器上,它的工作原理。 – HexEDSyght

0

使用UNION和樞軸,這樣的事情應該做的世界衛生大會T優想(PIVOT應SQL Server 2005和較新的工作):

SELECT Customer, [Red], [Blue], [Black] 
FROM (
    SELECT 'SRCTbl01' AS Customer, COLR1, INSTOCK FROM SRCTbl01 WHERE Type <> 'P' 
    UNION 
    SELECT 'SRCTbl02' AS Customer, COLR1, INSTOCK FROM SRCTbl02 WHERE Type <> 'P' 
    UNION 
    SELECT 'SRCTbl03' AS Customer, COLR1, INSTOCK FROM SRCTbl03 WHERE Type <> 'P' 
    /* UNION ... */ 
) AS SRC 
PIVOT (
    MAX(INSTOCK) 
    FOR COLR1 IN ([Red], [Blue], [Black]) 
) AS pvt 
+0

由於某種原因,PIVOT不想在我的SQL服務器上工作。 我沒有在SQL小提琴中測試你的代碼,儘管它工作得很好。 – HexEDSyght

+0

什麼是您使用的SQL服務器版本和buildnumber? – Dan

+0

我正在使用Microsoft SQL Server 2008.它給了我這個錯誤。 'PIVOT'附近的語法不正確。您可能需要將當前數據庫的兼容級別設置爲更高的值才能啓用此功能。請參閱ALTER DATABASE的SET COMPATIBILITY_LEVEL選項的幫助。' – HexEDSyght