【问题标题】:How do I merge 2 tables such that the result is flattened/merged?如何合并 2 个表以使结果展平/合并?
【发布时间】:2013-10-30 15:21:27
【问题描述】:

我有以下 2 个表

表 1:

TID         |Traning
---------------------------
1           |Training 1
2           |Training 2
3           |Training 3

表 2:

ID      |TID        |Status
-----------------------------------
1234567 |1          |1
1234567 |2          |1
1234567 |3          |1

我想构造一个新视图,结果如下所示,

结果:

ID      |[Training 1 Status] |[Training 2 Status] |[Training 3 Status]
------------------------------------------------------------------------------
1234567 |1                   |1                   |1

如何在 SQL Server 中实现这一点?

谢谢!

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:
CREATE TABLE #table1
    (
      ID VARCHAR(10) ,
      TID INT ,
      Status INT
    )
CREATE TABLE #table2 ( TID INT, Training varchar(10) )

--DROP TABLE #table1,#table2


INSERT INTO #table1
        ( ID, TID, Status )
SELECT  '1234567' AS [ID] ,
        '1' AS [TID] ,
        '1' AS [Status]
UNION ALL
SELECT  '1234567' AS [ID] ,
        '2' AS [TID] ,
        '1' AS [Status]
UNION ALL
SELECT  '1234567' AS [ID] ,
        '3' AS [TID] ,
        '1' AS [Status] 

INSERT  INTO #table2
        ( TID ,
          [Training]
        )
        SELECT  '1' AS [TID] ,
                'Training 1' AS [Training]
        UNION ALL
        SELECT  '2' AS [TID] ,
                'Training 2' AS [Training]
        UNION ALL
        SELECT  '3' AS [TID] ,
                'Training 3' AS [Training] 


SELECT  *
FROM    #table1


SELECT  *
FROM    #table2;



WITH temp_CTE  AS (SELECT  a.ID,b.TID,a.[Status] AS [Training Status]
FROM    #table1 a INNER JOIN #table2 b ON a.TID=b.TID)



SELECT  ID ,
        [1] AS [Training1] ,
        [2] AS [Training2] ,
        [3] AS [Training3]
FROM    ( SELECT    ID ,
                    TID ,
                    [Training Status]
          FROM       temp_CTE
        ) p PIVOT
( MAX([Training Status]) FOR tid IN ( [1], [2], [3] ) ) AS pvt

您在上面的代码中真正需要的是数据透视和连接命令,前面的代码只是我创建表,以便我可以对数据进行试验。

【讨论】:

  • 非常感谢,是否可以动态获取列名?这样我就不提了,'Training 1' AS [Training] 等等?
  • 为什么我们在做[1] AS [Training1]的时候需要Inner Join?我可以在没有内部连接的情况下实现它,看看这里,sqlfiddle.com/#!3/595d2/5。我错过了什么吗?
  • 我只是使用 CTE 内部的内部联接来组合您的两个表,联接类型取决于您的要求。是的,您可以创建一个动态 sql,它根据 #table2 中的培训列选择培训列
【解决方案2】:

试试这个:

   SELECT ID,[1] AS [Training 1 Status] , [2] AS [Training 2 Status],[3] AS [Training 3 Status] FROM 
(SELECT DISTINCT Table_2.[ID],Table_2.TID,Table_2.[Status] FROM Table_1 INNER JOIN 
Table_2 ON Table_1.TID=Table_2.TID)  [Source_Tab] PIVOT 
(MAX([Status]) FOR [TID] IN ([1],[2],[3])) AS [Pivot_Tab];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2017-04-29
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多