我在这里并不是最精通SQL的人,但是我正在尝试联接两个表(一个包含费用数据,另一个包含预算数据)。我似乎无法找出正确的代码来按字段汇总支出,然后将其与那些特定字段的预算金额相加。
以下是我正在处理的数据的示例:
Expenses Table
BudgetAccount Department Entity Date Amount
Other Expenses Finance A 9/1/2019 100
Other Expenses Finance A 9/1/2019 300
Other Expenses Finance A 9/1/2019 50
Utilities Finance A 9/1/2019 200
Utilities Construction B 9/1/2019 300
Insurance Construction B 9/1/2019 400
Legal HR A 9/1/2019 500
Other Expenses HR A 9/1/2019 100
Legal HR A 9/1/2019 50
Budget Table
BudgetAccount Department Entity Date Amount
Other Expenses Finance A 9/1/2019 500
Utilities Finance A 9/1/2019 200
Insurance Construction B 9/1/2019 450
Utilities Construction B 9/1/2019 400
Legal HR A 9/1/2019 800
Other Expenses HR A 9/1/2019 50
这是我想要得到的最终产品:
BudgetAccount Department Entity Date Actual Budget
Other Expenses Finance A 9/1/2019 450 500
Utilities Finance A 9/1/2019 200 200
Insurance Construction B 9/1/2019 400 450
Utilities Construction B 9/1/2019 300 400
Legal HR A 9/1/2019 550 800
Other Expenses HR A 9/1/2019 100 50
我尝试了以下代码:
SELECT e.budgetaccount, e.department, e.entity, e.date, SUM(e.amount) AS Actual, b.amount
FROM expenses AS e
INNER JOIN (SELECT b.budgetaccount, b.department, b.entity, b.date, b.amount FROM budget AS b)
ON e.budgetaccount = b.budgetaccount
AND e.department = b.department
AND e.entity = b.entity
AND e.date = b.date
GROUP BY e.budgetaccount, e.department, e.entity, e.date
。 。 。这是我尝试在Tableau中运行查询时遇到的错误:
我敢肯定,我在上面尝试做得很差的编码中有很多错误,但是对我指出正确方向的任何帮助将不胜感激。
答案 0 :(得分:0)
我想您可能会遇到的唯一错误是not a group by etc.
,因为没有行与预算金额行不匹配,因此应在预算金额上添加一个最大值。实际上,内部联接会将第二个表记录作为输出,但事实是,列数和预算额列中没有记录是不同的,因此数据将是冗余的还是更多,具体取决于哪个表列具有更多的记录,因此所有第一个表记录是内部联接的实际o / p,在其上放一个group by将通过合计聚合减少实际数量的行,但是将表预算金额列的记录保持为没有聚合等的更多。尽管表预算帐户只有1个第一个表中每个唯一行的预算金额,但这并不意味着在最坏的情况下不能有多个,因此group by期望budgetamount列上的汇总也可以保持数据一致
Select... max(b.amount)..
Rest the same query
答案 1 :(得分:0)
发现了两个问题
1)表名别名b的位置错误
2)您需要的列不在聚合函数中
SELECT e.budgetaccount, e.department, e.entity, e.date, SUM(e.amount) AS Actual, b.amount
FROM expenses AS e
LEFT JOIN (
SELECT budgetaccount
, department
, entity
, date
, amount
FROM budget
) b ON e.budgetaccount = b.budgetaccount
AND e.department = b.department
AND e.entity = b.entity
AND e.date = b.date
GROUP BY e.budgetaccount, e.department, e.entity, e.date, b.amount
无论如何,您可以避免对预算表进行子查询。
SELECT e.budgetaccount, e.department, e.entity, e.date, SUM(e.amount) AS Actual, b.amount
FROM expenses AS e
LEFT JOIN budget b ON e.budgetaccount = b.budgetaccount
AND e.department = b.department
AND e.entity = b.entity
AND e.date = b.date
GROUP BY e.budgetaccount, e.department, e.entity, e.date, b.amount
答案 2 :(得分:-1)
我相信您已经关闭查询。似乎不需要子选择,也不需要添加其他SUM
SELECT e.budgetaccount, e.department, e.entity, e.date, SUM(e.amount) AS Actual, SUM(b.amount) as budget
FROM expenses AS e
JOIN budget AS b
ON e.budgetaccount = b.budgetaccount
AND e.department = b.department
AND e.entity = b.entity
AND e.date = b.date
GROUP BY e.budgetaccount, e.department, e.entity, e.date