1

我有两张桌子,invoicesdeposits

它们看起来有点像这样:

发票

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

存款总是过去的日期,发票日期将是,例如today,所以我想确定发票上今天支付的余额,即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 查询将适用于用 CASH 支付的项目,但不适用于卡支付,因为分组invoices.paymentType意味着表中的idinvoices不再正确,因此JOIN如果该行有一个id与存款无关的列,则失败.

如何运行如上所述的查询,但确保我可以在发票的任何实例上joindeposits表格,按与分组列 id 记录匹配的付款类型分组?

我正在使用 mySql,所以请发布 MySql 可以做的连接!:D

4

1 回答 1

0

问题是,当您使用 时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 以卡支付。

于 2012-09-07T10:48:59.007 回答