下圖左邊是資料庫的內容,右邊是想要查出來的結果
Dept=部門 ,CMonth=建立月份 ,FMonth=預測月份 ,Amount=金額
AA部門每月會預測4個月的業績,
2021-07時預測未來4個月業績各是100元
2021-08時預測未來4個月業績各是150元
而SQL想查詢2021-07 ~ 2021-11 最新的預測內容
(AA部門在2021-08上傳了最新的預測,所以2021-08~2021-11以2021-08(CMonth)上傳的顯示
而2021-07只有一筆資料所以就顯示這筆)
同樣BB部門也是
原本我在本機MySQL是可以用
SELECT * FROM TableA
GROUP BY Dept,FMonth
但發現Server的MySQL有sql_mod=only_full_group_by的限制
想請問一下有其它的查詢語法可以查出來嗎?
謝謝解答
CREATE TABLE TableA(
Dept varchar(20),
CMonth varchar(20),
FMonth varchar(20),
Amount float);
INSERT INTO TableA (Dept,CMonth,FMonth,Amount)
VALUES
('AA','2021-07','2021-07',100),
('AA','2021-07','2021-08',100),
('AA','2021-07','2021-09',100),
('AA','2021-07','2021-10',100),
('AA','2021-08','2021-08',150),
('AA','2021-08','2021-09',150),
('AA','2021-08','2021-10',150),
('AA','2021-08','2021-11',150),
('BB','2021-07','2021-07',110),
('BB','2021-07','2021-08',110),
('BB','2021-07','2021-09',110),
('BB','2021-07','2021-10',110),
('BB','2021-08','2021-08',120),
('BB','2021-08','2021-09',120),
('BB','2021-08','2021-10',120),
('BB','2021-08','2021-11',120);
-- MySQL 8.0
SELECT Dept,FMonth,Amount
FROM (
SELECT Dept,FMonth,Amount,
ROW_NUMBER() OVER (PARTITION BY Dept,FMonth ORDER BY CMonth DESC) AS NO
FROM TableA
) AS TEMP
WHERE NO=1
ORDER BY Dept,FMonth
-- 非 MySQL 8.0
SELECT Z.Dept,Z.FMonth,M.Amount
FROM (
SELECT X.Dept,MAX(Y.CMonth) AS CMonth,X.FMonth
FROM TableA AS X
LEFT JOIN TableA AS Y ON Y.Dept=X.Dept AND Y.FMonth=X.FMonth
GROUP BY X.Dept,X.FMonth) AS Z
LEFT JOIN TableA M ON M.Dept=Z.Dept AND M.FMonth=Z.FMonth AND M.CMonth=Z.CMonth
ORDER BY Z.Dept,Z.FMonth
一般有兩種解法。
第一種是運行前事先將 sql_mod 做改變。
如
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY,',''));
但這招要有一定的權限才能做修改。如果連那一點權限都沒的話。就沒用了。
第二招就是遵照著其語法了。大多數來說。就是SELECT要跟著GROUP的欄位加對應的GROUP的函數對應。
如
SELECT name,max(id) FROM db GROUP BY name;
SELECT name FROM db GROUP BY name;
SELECT name,data1,data2 FROM db GROUP BY name,data1,data2;