簡體   English   中英

獲取每個月的所有值,如果沒有該月的數據,則將其歸零

[英]Getting all value from every month, put zero if no data of that month

我正在嘗試獲取每個月的數據,如果沒有找到特定月份的數據,我將置零。 我已經創建了一個日歷表,所以我可以離開加入它,但我仍然無法得到零。

這是我的查詢

SELECT calendar.month, IFNULL(SUM(transaction_payment.total),0) AS total 
FROM `transaction` 
JOIN `transaction_payment` ON `transaction_payment`.`trans_id` = 
`transaction`.`trans_id` 
LEFT JOIN `calendar` ON MONTH(transaction.date_created) = calendar.month 
WHERE`date_created` LIKE '2017%' ESCAPE '!' 
GROUP BY calendar.month 
ORDER BY `date_created` ASC

我的日歷表中的值為 1-12(Jan-Dec) int

結果應該是這樣的

month   total
1       0
2       20
3       0
4       2
..
11      0
12      10

更新

問題似乎是 SUM 函數

SELECT c.month, COALESCE(t.trans_id, 0) AS total 
FROM calendar c
LEFT JOIN transaction t ON month(t.date_created) = c.month AND year(t.date_created) = '2018' 
LEFT JOIN transaction_payment tp ON tp.trans_id = t.trans_id 
ORDER BY c.month ASC

我嘗試只顯示 ID 並且運行良好。 但是當我加回這個功能時。 我只能得到幾個月的價值。

COALESCE(SUM(tp.total), 0);

這解決了您的查詢問題:

SELECT c.month, COALESCE(SUM(tp.total), 0) AS total 
FROM calendar c LEFT JOIN
     transaction t
     ON month(t.date_created) = month(c.month) AND
        year(t.date_created) = '2017' LEFT JOIN
     transaction_payment tp
     ON tp.trans_id = t.trans_id 
GROUP BY c.month 
ORDER BY MIN(t.date_created) ASC;

這僅在“日歷”表每月有一行時才有效——這看起來很奇怪,但這可能是您的數據結構。

注意變化:

  • calendar表開始,因為這些是您要保留的行。
  • 不要對日期使用LIKE MySQL 有適當的date函數。 使用它們。
  • 除第一個表外的所有表的過濾條件都應在ON子句中,而不是在WHERE子句中。
  • 我更喜歡COALESCE()IFNULL()因為COALESCE()是 ANSI 標准。

您需要根據您的查詢使用權限,因為您的日歷表位於右側

SELECT calendar.month, IFNULL(SUM(transaction_payment.total),0) AS total 
FROM `transaction` 
JOIN `transaction_payment` ON `transaction_payment`.`trans_id` = 
`transaction`.`trans_id` 
RIGHT JOIN `calendar` ON MONTH(transaction.date_created) = calendar.month 
WHERE`date_created` LIKE '2017%' ESCAPE '!' 
GROUP BY calendar.month 
ORDER BY `date_created` ASC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM