iT邦幫忙

2

請問MySQL查詢最新資料問題

  • 分享至 

  • xImage

下圖左邊是資料庫的內容,右邊是想要查出來的結果
https://ithelp.ithome.com.tw/upload/images/20210804/20053001jUQNTqpshu.jpg

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的限制
想請問一下有其它的查詢語法可以查出來嗎?
謝謝解答

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

3
rogeryao
iT邦超人 7 級 ‧ 2021-08-04 19:47:11
最佳解答
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

Demo

rogeryao iT邦超人 7 級 ‧ 2021-08-04 22:23:55 檢舉

PG 好精簡喔

ninja iT邦研究生 2 級 ‧ 2021-08-04 23:06:29 檢舉

感謝兩位大神

1

一般有兩種解法。

第一種是運行前事先將 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;
ninja iT邦研究生 2 級 ‧ 2021-08-04 17:43:16 檢舉

因為沒權限,所以才想說是不是有其它語法可以查出想要的結果,謝謝

其實也沒其它所謂的語法了。
畢竟簡單來說,如果你是想找SELECT * 可以處理GROUP的方式。
可以說是沒有就是了。

早期我還沒用ORM純SQL語法之前。
我是將「*」取代為欄位的名稱出來。躲GROUP的應用限制處理就是了。

畢竟「ONLY_FULL_GROUP_BY」講白一點,就是不能讓你偷懶下語法。
讓它做欄位分析苦工的意思了。

我要發表回答

立即登入回答