簡體   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