如何在MYSQL中使用多个表之间的总和/计数进行复杂的联接

时间:2018-07-31 14:14:38

标签: mysql join

我正在尝试编写一个复杂的查询(至少对我来说),该查询连接一些表以从“班次”(例如商店的出纳员班次)表返回数据,以及在这些班次期间发生的交易总和特定的商店。

我有一个包含以下信息的班次表

  • shiftID
  • cashierID
  • startTime
  • endTime

具有此信息的交易表

  • transactionID
  • branchID
  • 金额
  • shiftID

带有此信息的收银台

  • cashierID
  • 商家ID
  • cashierName

具有此信息的分支表

  • branchID
  • 商家ID

我有一个如下查询:

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

因此,基本上,这可以返回我需要的所有班次信息,但是它汇总了每一行中该商家的所有交易,而不仅仅是特定于该行中返回的交易。

是否可以通过查询每个班次行的每个班次的总数进行查询?

2 个答案:

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