2013-10-07 106 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