我有两个表,我试图从中创建视图。我遇到的问题是我要加入的列在两个表中都没有相同的值。
这是我的表结构。
表格1
+-----+------+-------+
| bln | thn | qty1 |
+-----+------+-------+
| 1 | 2014 | 10 |
| 1 | 2014 | 20 |
| 2 | 2014 | 30 |
| 3 | 2014 | 40 |
| 2 | 2014 | 50 |
| 4 | 2014 | 60 |
+-----+------+-------+
Run Code Online (Sandbox Code Playgroud)
表 2
+-----+------+------+
| bln | thn | qty2 |
+-----+------+------+
| 3 | 2014 | 200 |
| 5 | 2014 | 400 |
| 2 | 2014 | 100 |
| 2 | 2014 | 500 |
| 4 | 2014 | 300 |
| 6 | 2014 | 600 |
+-----+------+------+
Run Code Online (Sandbox Code Playgroud)
视图的结果应该是:
+-----+------+------+------+
| bln | thn | qty1 | qty2 |
+-----+------+------+------+
| 1 | 2014 | 30 | 0 |
| 2 | 2014 | 80 | 600 |
| 3 | 2014 | 40 | 200 |
| 4 | 2014 | 60 | 300 |
| 5 | 2014 | 0 | 400 |
| 6 | 2014 | 0 | 600 |
+-----+------+------+------+
Run Code Online (Sandbox Code Playgroud)
要获得您想要的结果,您似乎需要使用FULL JOIN. FULL JOIN 将连接bln列上的 2 个表,但它会从两个表返回数据,即使列的值没有出现在两个表中。
查询的基本语法是:
select
bln = coalesce(t1.bln, t2.bln),
thn = coalesce(t1.thn, t2.thn),
qty1 = isnull(t1.qty1, 0),
qty2 = isnull(t2.qty2, 0)
from table1 t1
full join table2 t2
on t1.bln = t2.bln
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo。这将产生以下结果:
| BLN | THN | QTY1 | QTY2 |
|-----|------|------|------|
| 1 | 2014 | 10 | 0 |
| 1 | 2014 | 20 | 0 |
| 2 | 2014 | 30 | 100 |
| ....
| 5 | 2014 | 0 | 400 |
| 6 | 2014 | 0 | 600 |
Run Code Online (Sandbox Code Playgroud)
您会注意到我COALESCE在列上使用了 abln并且thn- 这将返回这些列中的第一个非空值。然后我IsNull在qty1, 和qty2列上null使用零替换为这些列返回的值。您可以使用COALESCE或ISNULL用于这些操作 - 我将两者都用于演示目的。
现在,由于您想要获得qty1和qty2列的总和,您将添加带有 group by 的聚合函数。我实际上会在每个表的子查询中执行此操作,否则您可以获得每个数量的增加的总数。
select
bln = coalesce(t1.bln, t2.bln),
thn = coalesce(t1.thn, t2.thn),
qty1 = isnull(t1.qty1, 0),
qty2 = isnull(t2.qty2, 0)
from
(
select bln, thn, qty1 = sum(qty1)
from table1
group by bln, thn
) t1
full join
(
select bln, thn, qty2 = sum(qty2)
from table2
group by bln, thn
) t2
on t1.bln = t2.bln
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo。这给出了结果:
| BLN | THN | QTY1 | QTY2 |
|-----|------|------|------|
| 1 | 2014 | 30 | 0 |
| 2 | 2014 | 80 | 600 |
| 3 | 2014 | 40 | 200 |
| 4 | 2014 | 60 | 300 |
| 5 | 2014 | 0 | 400 |
| 6 | 2014 | 0 | 600 |
Run Code Online (Sandbox Code Playgroud)
最后,您只需使用查询来创建视图:
create view dbo.your_view as
select
bln = coalesce(t1.bln, t2.bln),
thn = coalesce(t1.thn, t2.thn),
qty1 = isnull(t1.qty1, 0),
qty2 = isnull(t2.qty2, 0)
from
(
select bln, thn, qty1 = sum(qty1)
from table1
group by bln, thn
) t1
full join
(
select bln, thn, qty2 = sum(qty2)
from table2
group by bln, thn
) t2
on t1.bln = t2.bln
Run Code Online (Sandbox Code Playgroud)
看演示