Sql 如何合并同一表的两列数据?
假设我有一个导致以下结果的存储过程 存储过程代码Sql 如何合并同一表的两列数据?,sql,sql-server,left-join,sql-null,Sql,Sql Server,Left Join,Sql Null,假设我有一个导致以下结果的存储过程 存储过程代码 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 S
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和scale2组合起来,使其成为单列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 |
+------+----------+--------+
我如何才能做到这一点,请帮助。您可以使用coalesce()
:
这将优先考虑第一个左联接表中的值,并返回到另一个表。使用合并()
另一种可能的方法是ISNULL()
(如果s1.Amount
和s2.Amount
列中都有值,则这是一个附加选项):
嗯。似乎您要取消打印数据:
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;
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
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
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;