我正在尝试编写一个复杂的(至少对我来说)查询,它连接几个表以返回“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
所以基本上这是用来返回我所需要的信息,但它在每一行这个商人所有交易的总和,不只是那些具体的转移返回在那一行。
有没有可能用一种方式来查询每个班次行中每个班次的总数?
2条答案
按热度按时间mbjcgjjk1#
如果在语句中使用sum(或任何聚合函数,如count、avg、min、max…),但不使用group by子句,则该函数将应用于整个结果集。这就是为什么要得到所有事务的总和。
现在,总和在您的内部查询中。如果在其中添加group by,则很可能会出现错误,因为将返回多个值。因此,您必须重新构造查询,可能需要将sum取出并将其与groupby子句一起放入外部查询。
ps:如果您创建一个sql fiddle并填充一些数据,我很乐意为您尝试。
pkln4tw62#
通过上面的@memo解决了这个问题:
删除了从内部查询到外部查询的总和,并对总和应用大小写以检查是否有大于0的值。这样地: