两个表的总和会从一个表中返回不需要的总和乘以另一个表中的行数
我有1个表,其中按日期记录了实际结果,其他表包含了按月记录的计划结果。
Table 1(Actual)
Date Location Amount
01/01/2019 Loc1 1000
01/02/2019 Loc1 700
01/01/2019 Loc2 7500
01/02/2019 Loc2 1000
02/01/2019 Loc1 500
Table 2(Plan)
Year Month Location Amount
2019 1 Loc1 1500
2019 1 Loc2 8000
2019 2 Loc1 800
我尝试使用YEAR(Table1.date)和Month(table1.date)进行各种不同的联接,并按 Month(Table1.Date),但是我遇到了同样的问题,即PlanAmount乘以实际表中的许多行...
在下面的第1个月的loc1的示例中,
Year Month Location PlanAmount ActualAmount
2019 1 Loc1 3000 1700
我想返回以下内容
Year Month Location PlanAmount ActualAmount
2019 1 Loc1 1500 1700
2019 1 Loc2 8000 8500
2019 2 Loc1 800 500
在此先感谢您的帮助 D
答案 0 :(得分:1)
您可以使用StatefulWidget
或full join
/ union all
来做到这一点:
group by
即使在其他表中没有匹配项,这也可以确保您有行。
答案 1 :(得分:1)
要获得所需的结果,您需要将第一个表按日期,年月和位置分组,并需要从组中选择年,月,位置和金额总和列,之后您需要将结果汇总r
SELECT
plans.year,
plans.month,
plans.location,
plans.plan_amount,
grouped_results.actual_amount
FROM plans
INNER JOIN (
SELECT
datepart(year, date) AS year,
datepart(month, date) AS month,
location,
SUM(amount) AS actual_amount
FROM actuals
GROUP BY datepart(year, date), datepart(month, date), location
) as grouped_results
ON
grouped_results.year = plans.year AND
grouped_results.month = plans.month AND
grouped_results.location = plans.location
答案 2 :(得分:1)
我认为问题在于您在分组时正在使用sum(PlanTable.Amount)
。尝试改用max(PlanTable.Amount)
。
select
p.Year,
p.Month,
p.Location,
sum(a.Amount) as actual_amount,
max(p.Amount) as plan_amount
from
[Plan] p left join Actual a
on year(a.date) = p.year
and month(a.date) = p.Month
and a.Location = p.Location
group by
p.year,
p.month,
p.Location
答案 3 :(得分:0)
从日期获取年份和月份并在join中使用它们,大多数dbms具有可以根据您的DBMS使用的年份和月份功能
select year(t1.date) yr,month(t1.date) as monthofyr ,t1.Location,
sum(t1.amount) as actual_amoun,
sum(t2.amount) as planamount
from table1 t1 left join table2 t2 on
month(t1.date)= t2.Month and t1.Location=t2.Location
and year(t1.date)=t2.year
group by year(t1.date) ,month(t1.date),Location