繁体   English   中英

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

[英]How to do a complex join with sums/counts between multiple tables in MYSQL

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

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

  • shiftID
  • 收银员ID
  • 开始时间
  • 时间结束

具有此信息的交易表

  • transactionID
  • branchID
  • shiftID

带有此信息的收银台

  • 收银员ID
  • 商人ID
  • 收银员姓名

具有此信息的分支表

  • 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

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

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

如果在语句中使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM