繁体   English   中英

对分组数据行使用联接

[英]Using a Join with Grouped Data Rows

我有两个表, 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查询以上,将用于支付与现金项目工作,而不是为卡支付,因为,分组invoices.paymentType意味着该id从柱invoices表不再是正确的,所以JOIN如果此行有失败与存款无关的id

如何运行上述查询,但要确保我可以将发票上的depositsjoin deposits表,并按与分组的列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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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