【发布时间】:2018-12-12 23:14:08
【问题描述】:
我在 MS SQL Server 2014 中有三个表。每个表都包含几个数值、一个描述和一个日期。为简洁起见,我们假设以下表格:
table "beverages"
day beverage amount
---------- -------- ------
2018-12-01 water 2
2018-12-01 tea 1
2018-12-01 coffee 7
2018-12-02 water 4
2018-12-02 tea 2
table "meals"
day meal amount
---------- ------ ------
2018-12-01 burger 1
2018-12-01 bread 2
2018-12-02 steak 1
table "fruit"
day fruit amount
---------- ------ ------
2018-12-01 apple 4
2018-12-01 banana 1
2018-12-02 apple 2
然后我有另一个表只包含日期列表。
table "dates"
day
----------
2018-12-01
2018-12-02
我需要的是一个查询,它为dates 表中的每一行返回一行,每一行都有日期、饮料总量、膳食总量和水果总量为那一天。我不关心不同类型的饮料、膳食和水果,只关心总和。结果应该是:
expected result
day beverages meals fruit
---------- ----------- ----------- -----------
2018-12-01 10 3 5
2018-12-02 6 1 2
但是我收到了
received result
day beverages meals fruit
---------- ----------- ----------- -----------
2018-12-01 40 18 30
2018-12-02 6 2 4
我已经知道问题出在哪里,只是不知道如何解决。更糟糕的是,我确信我曾经知道答案,但现在我什至无法找出正确的搜索词来让 Google 告诉我......
当我进行这样的查询时(我使用表变量进行测试)
SELECT
[d].[day]
,SUM([b].[amount]) AS [beverages]
,SUM([m].[amount]) AS [meals]
,SUM([f].[amount]) AS [fruit]
FROM @dates AS [d]
LEFT OUTER JOIN @beverages AS [b]
ON [d].[day] = [b].[day]
LEFT OUTER JOIN @meals AS [m]
ON [d].[day] = [m].[day]
LEFT OUTER JOIN @fruit AS [f]
ON [d].[day] = [f].[day]
GROUP BY [d].[day]
它不止一次地对不同表中的每一行求和,因为它返回三个表的所有可能组合。删除 SUM() 和 GROUP BY 证明:
day beverages meals fruit
---------- ----------- ----------- -----------
2018-12-01 2 1 4
2018-12-01 2 1 1
2018-12-01 2 2 4
2018-12-01 2 2 1
2018-12-01 1 1 4
2018-12-01 1 1 1
2018-12-01 1 2 4
2018-12-01 1 2 1
2018-12-01 7 1 4
2018-12-01 7 1 1
2018-12-01 7 2 4
2018-12-01 7 2 1
2018-12-02 4 1 2
2018-12-02 2 1 2
那么,我需要在查询中进行哪些更改,以使其对三个表中每个表的值求和,而不将其与其他表中的行数相乘?
【问题讨论】:
标签: sql-server tsql join pivot aggregate