【问题标题】:Add rows in a table after join it with another table将表与另一个表连接后在表中添加行
【发布时间】:2015-03-23 12:09:43
【问题描述】:

我的这张表包含以下数据

user   DateKey        Dist
 10    20140904      102
 10    20140907      250
 10    20141003      120
 10    20141015      555
 15    20140904      180
 15    20140906      135
 15    20141023      120
 15    20141015      55
 15    20141126      155

另外一张表有以下数据

user   MonthKey     Price
 10   201409         12500
 10   201410         3000
 15   201409         20000
 15   201410         1000

我需要的是将表与用户和 DateKey 与 MonthKey 连接。结果表应如下所示

user   DateKey        Dist    Price
 10    20140904      102
 10    20140907      250
 10    201409                  12500
 10    20141003      120
 10    20141015      555
 10    201410                  3000
 15    20140904      180
 15    20140906      135
 15    201409                  20000
 15    20141023      120
 15    20141015      55
 15    201410                  1000
 15    20141126      155

【问题讨论】:

  • 我想你想要UNION (ALL)。 - SELECT user, DateKey, Dist, Price = NULL FROM T1 UNION ALL SELECT User, MonthKey, NULL, Price FROM T2

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012


【解决方案1】:
SELECT [user], DateKey, Dist, null price
FROM table1
UNION ALL
SELECT [user], DateKey, null Dist, price
FROM table2
ORDER BY [user], DateKey

【讨论】:

    【解决方案2】:
    declare @t table (userid int,datekey varchar(12),dist int)
    insert into @t (userid,datekey,dist)values (10,'20140904',102)
    insert into @t (userid,datekey,dist)values (10,'20140907',250)
    insert into @t (userid,datekey,dist)values (10,'20141004',120)
    insert into @t (userid,datekey,dist)values (10,'20141008',555)
    insert into @t (userid,datekey,dist)values (15,'20140904',182)
    insert into @t (userid,datekey,dist)values (15,'20140907',160)
    insert into @t (userid,datekey,dist)values (15,'20141004',55)
    insert into @t (userid,datekey,dist)values (15,'20141008',155)
    
    declare @tt table (userid int,monthkey varchar(10),price int)
    insert into @tt (userid,monthkey,price)values (10,'201409',12500)
    insert into @tt (userid,monthkey,price)values (10,'201410',3000)
    insert into @tt (userid,monthkey,price)values (15,'201409',2000)
    insert into @tt (userid,monthkey,price)values (15,'201410',1000)
    ;WITH CTE_Date
    AS(
    select distinct 
    userid,
    datekey,
    dist  ,
    0 AS Price from @t 
    UNION 
    SELECT 
    userid,
    MonthKey+'28' AS datekey ,
    0 AS DateKey,
    price 
    FROM @tt 
    )
    SELECT userid,
    CASE WHEN SUBSTRING(datekey,7,2) ='28' THEN  LEFT(Datekey,6)+REPLACE(RIGHT(datekey,2),'28','') ELSE datekey END AS datekey,
     NULLIF(dist,'')  AS dist, 
     NULLIF(Price,'') AS Price 
     FROM CTE_Date ORDER BY userid,CAST(Datekey AS DATE) 
    

    【讨论】:

      【解决方案3】:

      将两个表合并在一起,然后围绕所有表进行选择,以便能够组织结果。

      SELECT W.UsrName,
             W.DateKey,
             W.Dist,
             W.Price
      FROM (
      SELECT TA.UsrName,
             TA.DateKey,
             TA.Dist, 
             NULL [Price] FROM Table1 TA 
      UNION 
      SELECT T.UsrName,
             T.MonthKey [DateKey],
             NULL,
             T.PRICE FROM Table2 T     
      ) W
      ORDER BY W.UsrName, W.DateKey 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        相关资源
        最近更新 更多