我有两个表,invoices
和 deposits
。
它们看起来有点像这样:
发票
id | paymentType | grossTotal | dateTime
1 | Cash | 1000 | UNIX TIME
2 | Card | 1350 | UNIX TIME
3 | Card | 1250 | UNIX TIME
4 | Card | 750 | UNIX TIME
存款
id | paymentType | invNo | dateTime | amount
1 | Cash | 1 | UNIX TIME | 150
2 | Card | 2 | UNIX TIME | 350
存款总是过去的日期,发票日期将是,例如 今天
,所以我想确定今天在发票上支付的余额,即 invoices.grossTotal - deposits.amount
,并按支付类型列出。
因此,在上面的表格示例中,发票 1 支付了 850 英镑,发票 2 支付了 1000 英镑,这很容易实现,每行一到两行,但是当对付款类型和存款发票进行分组时我卡住了……
SELECT
invoices.id,
sum(grossTotal)-IFNULL(depositsCheck.previouslyPaid,0) as todayTotal,
depositsCheck.previouslyPaid, sum(grossTotal) as grossTotal
FROM `invoices`
LEFT JOIN (SELECT SUM(amount) as previouslyPaid, invNo
FROM deposits
GROUP BY invNo) depositsCheck ON depositsCheck.invNo=invoices.id
GROUP BY invoices.paymentType ORDER BY id DESC
上面的 SQL 查询适用于使用现金支付的项目,但不适用于卡支付,因为分组 invoices.paymentType
意味着 id
列invoices
表中的数据不再正确,因此如果此行具有与存款无关的 id
,则 JOIN
将失败。
我如何运行上述查询,但确保我可以加入
发票的任何实例上的存款
表,按与分组匹配的付款类型分组列 ID 记录?
我正在使用 mySql,所以请发布 MySql 可以执行的连接! :D
最佳答案
问题是,当您使用GROUP BY
时,您只能SELECT
聚合和您分组的列。
invoices.id
是您尝试选择但未分组的列。我想您可能想将此列添加到 GROUP BY
子句中。
SELECT
invoices.id,
sum(grossTotal)-IFNULL(depositsCheck.previouslyPaid,0) as todayTotal,
depositsCheck.previouslyPaid, sum(grossTotal) as grossTotal
FROM `invoices`
LEFT JOIN (SELECT SUM(amount) as previouslyPaid, invNo
FROM deposits
GROUP BY invNo) depositsCheck ON depositsCheck.invNo=invoices.id
GROUP BY invoices.paymentType, invoices.id ORDER BY id DESC
对于您给出的示例表,它可能会给出:
id | paymentType | grossTotal | dateTime | previouslyPaid
1 | Cash | 1000 | UNIX TIME | 150
2 | Card | 1350 | UNIX TIME | 350
3 | Card | 1250 | UNIX TIME | 0
4 | Card | 750 | UNIX TIME | 0
但一般来说,您会遇到类似这样的情况:
id | paymentType | grossTotal | dateTime | previouslyPaid
1 | Cash | 1000 | UNIX TIME | 150
1 | Card | 1000 | UNIX TIME | 300
2 | Cash | 1350 | UNIX TIME | 350
2 | Card | 1350 | UNIX TIME | 350
如上所示,对于发票 1,150 是现金支付的,300 是刷卡支付的。
关于mysql - 使用与分组数据行的联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12316472/