SQL:如何从不同的表中求和两个值

39

我有许多需要汇总的表格数值,它们没有关联,但在所有表格中顺序都是相同的。

基本上,我想将这两个表格:

CASH TABLE  
London  540
France  240
Belgium 340

CHEQUE TABLE
London  780
France  490
Belgium 230

为了获得这样的输出结果并将其输入到绘图应用程序中:

London  1320
France  730
Belgium 570

提示:UNIONGROUP BYSUM会很有用。 - zero323
4个回答

76
select region,sum(number) total
from
(
    select region,number
    from cash_table
    union all
    select region,number
    from cheque_table
) t
group by region

Union all 和 union 有什么区别,让人很好奇。 - fungusanthrax
2
@fungusanthrax UNION本身将删除非唯一(重复)行。UNION ALL将保留联合中的所有行,使总和准确。 - Harrison

29
SELECT (SELECT COALESCE(SUM(London), 0) FROM CASH) + (SELECT COALESCE(SUM(London), 0) FROM CHEQUE) as result

'等等,诸如此类。'

“COALESCE函数的基本作用是说:“返回第一个参数,除非它为null,在这种情况下返回第二个参数”-在这些场景中非常实用。”来源


1
'London' 是表中的一个条目,而不是一列。 - Uchenna Ebilah
2
这样,即使其中一个SUM为NULL,整个“result”也将为null,这是最简单但最不可靠的方法,不幸的是... - TheCuBeMan
@TheCuBeMan,没错,但是使用COALESCE函数可以避免这种情况。 - AlwaysANovice

3
你也可以在SQL Server中尝试这个!!
select a.city,a.total + b.total as mytotal from [dbo].[cash] a join [dbo].[cheque] b on a.city=b.city 

演示

或者尝试使用sum、union函数。

select sum(total)  as mytotal,city
from
(
    select * from cash union
    select * from cheque
) as vij
group by city 

0

针对您当前的结构,您也可以尝试以下方法:

select cash.Country, cash.Value, cheque.Value, cash.Value + cheque.Value as [Total]
from Cash
join Cheque
on cash.Country = cheque.Country

我认为我更喜欢将这两个表联合起来,并按照上述提到的国家名称进行分组。

但我也建议您对表进行规范化。理想情况下,您应该有一个国家表,其中包含Id和Name,以及一个付款表,其中包含: CountryId(外键指向国家),Total,Type(现金/支票)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接