查询两个不平衡表

时间:2019-06-21 10:18:39

标签: sql tsql

两个表的总和会从一个表中返回不需要的总和乘以另一个表中的行数

我有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

4 个答案:

答案 0 :(得分:1)

您可以使用StatefulWidgetfull 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

SQL Fiddle

答案 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