2017-10-04 48 views
0

我有3个表:如何从3个表格(SUM)创建正确的选择查询?

+-----+---------+ 
|cl_id| name | 
+-----+---------+ 
| 1 | adaf | 
| 2 | rich | - clients 
| 3 | call | 
| 4 | alen | 
| 5 | courney | 
| 6 | warren | 
+-----+---------+ 

+-----+---------+ 
|cl_id| data | 
+-----+---------+ 
| 1 |  13 | 
| 2 | 1000 | - table1 
| 5 |  0 | 
| 6 |  0 | 
+-----+---------+ 

+-----+---------+ 
|cl_id| data | 
+-----+---------+ 
| 2 | -355 | - table2 
| 3 | 35  | 
| 3 | 10  | 
| 5 |  46 | 
| 5 |  50 | 
| 5 |  10 | 
+-----+---------+ 

我要这三个表组合,所以结果应该是:

+-----+---------+--------+---------+ 
|cl_id| name |data_tb1|data_tb2 | 
+-----+---------+--------+---------+ 
| 1 | adaf | 13 |  0 | 
| 2 | rich | 1000 | -355 | 
| 3 | call |  0 |  45 | 
| 4 | alen |  0 |  0 | 
| 5 | courney|  0 |  106 | 
| 6 | warren |  0 |  0 | 
+-----+---------+--------+---------+ 

它应该输出所有的客户和他们的SUM(data)从表1和表2。客户变得越来越多。

在此先感谢

+0

我删除了不兼容的数据库标记。请仅使用您正在使用的数据库进行标记。 –

+0

@GordonLinoff完成 – ex1t3

+1

这看起来像一个基本的SUM,并留给我加入。 –

回答

4

只需用LEFT JOINGROUP BY

SELECT c.cl_id, 
     c.name, 
     COALESCE(SUM(t1.data), 0) AS data_tb1, 
     COALESCE(SUM(t2.data), 0) AS data_tb2 
FROM clients c 
    LEFT JOIN table1 t1 ON c.cl_id = t1.cl_id 
    LEFT JOIN table2 t2 ON c.cl_id = t2.cl_id 
GROUP BY c.cl_id, 
     c.name 
ORDER BY c.cl_id; 
+0

感谢您的答案,我会尝试 – ex1t3

+0

为什么你使用'COALESCE'?我不能只是简单地使用'(SUM())作为smth' ? – ex1t3

+0

@ex1t3是因为'NULL'的'SUM'返回NULL,所以它在你想要的输出中用'0'代替'NULL' –

0

如果您正在使用SQL Server那么简单使用Left Join如下:

SELECT C.cl_id, 
     C.name, 
     SUM(ISNULL(T.data, 0)) data_tb1, 
     SUM(ISNULL(T1.data, 0)) data_tb2 
FROM 
(
    SELECT * 
    FROM clients 
) C 
LEFT JOIN table1 T ON T.cl_id = C.cl_id 
LEFT JOIN table2 T1 ON T1.cl_id = C.cl_id 
GROUP BY C.cl_id, 
     C.name 
ORDER BY C.cl_id; 

所需的输出:

+-----+---------+--------+---------+ 
|cl_id| name |data_tb1|data_tb2 | 
+-----+---------+--------+---------+ 
| 1 | adaf | 13 |  0 | 
| 2 | rich | 1000 | -355 | 
| 3 | call |  0 |  45 | 
| 4 | alen |  0 |  0 | 
| 5 | courney|  0 |  106 | 
| 6 | warren |  0 |  0 | 
+-----+---------+--------+---------+