我正在尝试编写一个复杂的查询(至少对我来说),该查询连接一些表以从“班次”(例如商店的出纳员班次)表返回数据,以及在这些班次期间发生的交易总和特定的商店。
我有一个包含以下信息的班次表
具有此信息的交易表
带有此信息的收银台
具有此信息的分支表
我有一个如下查询:
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
因此,基本上,这可以返回我需要的所有班次信息,但是它汇总了每一行中该商家的所有交易,而不仅仅是特定于该行中返回的交易。
是否可以通过查询每个班次行的每个班次的总数进行查询?
答案 0 :(得分:1)
如果在语句中使用SUM(或与此相关的任何聚合函数,例如COUNT,AVG,MIN,MAX ...),但不使用GROUP BY子句,则该函数将应用于整个结果集。这就是为什么您获得所有交易的总和。
现在,SUM在内部查询中。如果在其中添加GROUP BY,则很可能会出错,因为将返回多个值。因此,您将不得不重新构建查询的结构,或者将SUM取出并与GROUP BY子句一起放入外部查询中。
PS:如果您创建一个SQL提琴并填充一些数据,我很乐意尝试为您完成。
答案 1 :(得分:1)
通过上面的@memo解决了该问题:
将总和从内部查询移至外部查询,并对总和应用个案以检查大于0的值。
List<String> keys = ...;
var paritions = Lists.partition(keys, (int) Math.ceil(keys.size() / 31D));