[英]How to do a complex join with sums/counts between multiple tables in MYSQL
我正在尝试编写一个复杂的查询(至少对我来说),该查询联接一些表以从“班次”(例如商店的出纳员班次)表返回数据,以及在特定商店的这些班次中发生的交易总和。
我有一个包含以下信息的班次表
具有此信息的交易表
带有此信息的收银台
具有此信息的分支表
我有一个查询,看起来像这样:
SELECT shifts.shiftID,
shifts.cashierID,
shifts.startTime,
cashiers.name as 'cashierName',
(SELECT sum(general_transactions.amount) from
general_transactions INNER JOIN shifts on
shifts.shiftID=general_transactions.shiftID
left join cashiers on cashiers.cashierID = shifts.cashierID
where general_transactions.amount > 0 AND shifts.endTime IS NOT NULL
and cashiers.merchantID=16) as 'loadUps'
from shifts LEFT JOIN cashiers on cashiers.cashierID =
shifts.cashierID where endTime is NOT NULL AND cashiers.merchantID = 16
因此,基本上,这可以返回我需要的所有班次信息,但是它汇总了每一行中该商家的所有交易,而不仅仅是特定于该行中返回的交易。
是否可以通过查询每个班次行的每个班次的总数进行查询?
如果在语句中使用SUM(或与此相关的任何聚合函数,例如COUNT,AVG,MIN,MAX ...),但不使用GROUP BY子句,则该函数将应用于整个结果组。 这就是为什么您获得所有交易的总和。
现在,SUM在内部查询中。 如果在其中添加GROUP BY,则很可能会出错,因为将返回多个值。 因此,您将不得不重新构建查询的结构,也许要取出SUM并将其与GROUP BY子句一起放入外部查询中。
PS:如果您创建一个SQL提琴并填充一些数据,我很乐意为您尝试。
通过上面的@memo解决了它:
从内部查询到外部查询中删除了总和,并对总和应用了一个格以检查大于0的值。像这样:
select shifts.shiftID,
shifts.cashierID,
shifts.startTime,
cashiers.name as 'cashierName',
sum(
CASE WHEN general_transactions.amount>0
THEN general_transactions.amount
ELSE 0
END
) as 'loadUps'
from shifts
LEFT JOIN cashiers
on cashiers.cashierID = shifts.cashierID
LEFT JOIN general_transactions
on general_transactions.shiftID = shifts.shiftID
where endTime is NOT NULL
AND cashiers.merchantID = 16
GROUP by shifts.shiftID;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.