簡體   English   中英

按月計數和多組 MYSQL

[英]COUNT AND MULTI GROUP BY MONTH MYSQL

請幫助我,我想用 eloquent 顯示數據,在此之前我必須創建一個原始查詢,以便在我想將它實現到 Eloquent 時更容易。 我想得到這樣的結果:

我想要的是

我試過使用這個查詢,但結果不是我想要的。

SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, mpk.nama_kanal, DATE_FORMAT(t.created_at, '%M %Y') tgl
FROM tr_pengaduan AS t
LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
GROUP BY YEAR(t.created_at),MONTH(t.created_at) ORDER BY kanal_id

上述查詢的結果: Result

以下是表格中的詳細信息:

1.表Tr_pengaduan: Tr_pengaduan

2.表ms_pengaduan_kanal: ms_pengaduan_kanal

有沒有辦法在有/沒有創建過程或 function 的情況下獲得我想要的結果? 如果您使用 Raw Query 或 Eloquent 或兩者都回復,我真的很感激。


更新:我嘗試了@ProGu 的建議,但加入的結果部分是 NULL。

SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, mpk.nama_kanal, DATE_FORMAT(t.created_at, '%M %Y') tgl, mont.MONTH
FROM tr_pengaduan AS t
LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
LEFT JOIN (SELECT MONTH(CURRENT_DATE()) AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-1 AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-2 AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-3 AS
MONTH
UNION SELECT MONTH(CURRENT_DATE())-4 AS
MONTH) AS mont ON MONTH(t.created_at) = mont.MONTH
WHERE t.kanal_id = mpk.kanal_id
GROUP BY mpk.kanal_id ORDER BY kanal_id 

結果:更新結果

嘗試這樣的事情:

查詢中的三個部分

  • month5 - 代表當前月份和前 4 個月
  • t - 結果集的 ID 和名稱
  • 計數 - 過去 5 個月的計數結果

SELECT COALESCE(counts.jml, 0) counts, t.kanal_id, t.nama_kanal, DATE_FORMAT(CURDATE() - INTERVAL month5.months MONTH, '%M %Y') tgl
FROM (
  SELECT 0 AS months
  UNION
  SELECT 1
  UNION
  SELECT 2
  UNION
  SELECT 3
  UNION
  SELECT 4
) month5
CROSS JOIN (
  SELECT t.kanal_id, MAX(mpk.nama_kanal) nama_kanal
  FROM tr_pengaduan t
  LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id
) t
LEFT JOIN (
  SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, DATE(MAX(t.created_at)) tgl
  FROM tr_pengaduan AS t
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id, YEAR(t.created_at), MONTH(t.created_at) 
) counts ON LAST_DAY(counts.tgl) = LAST_DAY(CURDATE() - INTERVAL month5.months MONTH) AND t.kanal_id = counts.kanal_id
ORDER BY kanal_id, tgl

你是最好的@ProGu,查詢效果很好。 順便說一句,我試圖用 LEFT JOIN 對計數列求和,但為什么我的查詢顯示已經求和的 kanal_id 的重復項?

SELECT COALESCE(counts.jml, 0) counts, t.kanal_id, t.nama_kanal, DATE_FORMAT(CURDATE() - INTERVAL month5.months MONTH, '%M %Y') tgl, total.total
FROM (
  SELECT 0 AS months
  UNION
  SELECT 1
  UNION
  SELECT 2
  UNION
  SELECT 3
  UNION
  SELECT 4
) month5
CROSS JOIN (
  SELECT t.kanal_id, MAX(mpk.nama_kanal) nama_kanal
  FROM tr_pengaduan t
  LEFT JOIN ms_pengaduan_kanal mpk ON t.kanal_id = mpk.kanal_id
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id
) t
LEFT JOIN (
  SELECT COUNT(t.pengaduan_id) jml, t.kanal_id, DATE(MAX(t.created_at)) tgl
  FROM tr_pengaduan AS t
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id, YEAR(t.created_at), MONTH(t.created_at) 
) counts ON LAST_DAY(counts.tgl) = LAST_DAY(CURDATE() - INTERVAL month5.months MONTH) AND t.kanal_id = counts.kanal_id
LEFT JOIN (
  SELECT COUNT(t.pengaduan_id) total, t.kanal_id FROM tr_pengaduan t
  WHERE t.created_at BETWEEN CURDATE() - INTERVAL DAY(CURDATE()) - 1 DAY - INTERVAL 4 MONTH AND NOW()
  GROUP BY t.kanal_id 
) total ON t.kanal_id = total.kanal_id
ORDER BY kanal_id ASC, CAST(tgl AS UNSIGNED) DESC

結果:結果

暫無
暫無

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

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