【问题标题】:How to combine two columns data of same table?如何合并同一张表的两列数据?
【发布时间】:2020-10-16 07:10:51
【问题描述】:

考虑到我有一个存储过程导致以下结果。

存储过程代码

DECALRE @myTab TABLE(
  Id int NOT NULL,
  Name nvarchar(30) NOT NULL,
  Scale1 int,
  Scale2 int
)

Insert into @myData(Id,Name,Scale1,Scale2)
Select 
I.Id,
I.Name,
S1.Amount,
S2.Amount
From Information I 
Left Join Scale1 S1 on I.Scale1Id = S1.Id
Left Join Scale2 S2 on I.Scale2Id = S2.Id


Select * From @myTab

这是结果表。

+------+----------+--------+---------+
| ID   | NAME     | Scale1 | Scale2  |
+------+----------+--------+---------+
|    1 | Ramesh   |   NULL | 1230    |
|    2 | Khilan   |   1560 | NULL    |
|    3 | kaushik  |   3000 | NULL    |
|    3 | kaushik  |   1500 | NULL    |
|    4 | Chaitali |   2060 | NULL    |
|    5 | Hardik   |   NULL | 1569    |
|    6 | Komal    |   NULL | 2548    |
|    7 | Muffy    |   NULL | 1256    |
+------+----------+--------+---------+

现在我想将 Scale1 和 Scale 2 列合并为单列 Scale,它没有空数据,如下例所示。

+------+----------+--------+
| ID   | NAME     | Scale  |  
+------+----------+--------+ 
|    1 | Ramesh   |   1230 |  
|    2 | Khilan   |   1560 | 
|    3 | kaushik  |   3000 |  
|    3 | kaushik  |   1500 |  
|    4 | Chaitali |   2060 |  
|    5 | Hardik   |   1569 |   
|    6 | Komal    |   2548 |  
|    7 | Muffy    |   1256 |  
+------+----------+--------+ 

我怎样才能做到这一点,请帮忙。

【问题讨论】:

    标签: sql sql-server left-join sql-null


    【解决方案1】:

    你可以使用coalesce():

    select 
        i.id,
        i.name,
        coalesce(s1.amount, s2.amount) scale
    from information i 
    left join scale1 s1 on i.scale1id = s1.id
    left join scale2 s2 on i.scale2id = s2.id
    

    这会优先考虑第一个left joined 表中的值,然后回退到另一个。

    【讨论】:

      【解决方案2】:

      使用coalesce()

      Select 
      I.Id,
      I.Name,
      coalesce(S1.Amount,S2.Amount) as amount
      From Information I 
      Left Join Scale1 S1 on I.Scale1Id = S1.Id
      Left Join Scale2 S2 on I.Scale2Id = S2.Id
      

      【讨论】:

        【解决方案3】:

        另一种可能的方法是ISNULL()(如果s1.Amounts2.Amount 列中都有值,这是一个附加选项):

        Insert into @myData (Id,Name,Scale1,Scale2)
        Select 
           I.Id,
           I.Name,
           ISNULL(S1.Amount, 0) + ISNULL(S2.Amount, 0) AS Amount
        From Information I 
        Left Join Scale1 S1 on I.Scale1Id = S1.Id
        Left Join Scale2 S2 on I.Scale2Id = S2.Id
        

        【讨论】:

          【解决方案4】:

          嗯。 . .似乎您想取消透视数据:

          select t.id, t.name, v.scale
          from @mytable t cross apply
               (values (t.scale1), (t.scale2)) v(scale)
          where v.scale is not null;
          

          【讨论】:

            猜你喜欢
            • 2020-06-20
            • 2017-08-22
            • 2016-01-16
            • 1970-01-01
            • 1970-01-01
            • 2021-02-02
            • 2015-11-22
            • 2019-11-15
            • 1970-01-01
            相关资源
            最近更新 更多