在mysql中如何在多个表之间使用sums/counts进行复杂连接

thtygnil  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(299)

我正在尝试编写一个复杂的(至少对我来说)查询,它连接几个表以返回“shifts”(想想商店的出纳轮班)表中的数据以及在特定商店的这些轮班期间发生的事务的总和。
我有一张班次表,上面有以下信息
什夫蒂德
收银员ID
开始时间
结束时间
包含此信息的事务表
操作号码
布兰奇德
数量
什夫蒂德
包含此信息的出纳表
收银员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

所以基本上这是用来返回我所需要的信息,但它在每一行这个商人所有交易的总和,不只是那些具体的转移返回在那一行。
有没有可能用一种方式来查询每个班次行中每个班次的总数?

mbjcgjjk

mbjcgjjk1#

如果在语句中使用sum(或任何聚合函数,如count、avg、min、max…),但不使用group by子句,则该函数将应用于整个结果集。这就是为什么要得到所有事务的总和。
现在,总和在您的内部查询中。如果在其中添加group by,则很可能会出现错误,因为将返回多个值。因此,您必须重新构造查询,可能需要将sum取出并将其与groupby子句一起放入外部查询。
ps:如果您创建一个sql fiddle并填充一些数据,我很乐意为您尝试。

pkln4tw6

pkln4tw62#

通过上面的@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;

相关问题