iT邦幫忙

0

SQL使用 GROUP BY

Select * From (
	Select ID,

	USER.NAME,

	USER.DT,

	DT.PARENT_ID

	From USER 
	Join DT On USER.DT = DT.DT
) TestTable Where ALLDT_ID = 
(
Select DT From ALLTANT Where USER_ID = 'KKBE' GROUP BY DT
)

這樣會找出ID 'KKBE' 所有同DT的人員
我加入GROUP BY DT 讓我結果能夠DT排序K00100跟K00100 K00200跟K00200 K00300跟K00300 K00400跟K00400 .....的聚合一起
我知道子集合order by是無效的 但為什麼GROUP BY DT 使用了一樣沒聚合呢?
對應Select DT 我使用別的資料庫排序看看數字可以 有什麼設定要給才能聚合或
一定要跟 SUM COUNT一起使用才能嗎?
出來結果如下 沒加GROUP BY DT 跟加了結果一樣
https://ithelp.ithome.com.tw/upload/images/20191009/20121723as7FazZvK3.png

0
ted59438
iT邦新手 5 級 ‧ 2019-10-09 00:56:55
最佳解答

讓我結果能夠DT排序K00100跟K00100 K00200跟K00200 K00300跟K00300 K00400跟K00400 .....的聚合一起

這個應該使用ORDER BY 而非使用GROUP BY

SELECT * 
FROM (
       SELECT ID,
              USER.NAME,
              USER.DT,
              DT.PARENT_ID
       FROM USER 
       JOIN DT ON USER.DT = DT.DT
     ) TestTable 
WHERE ALLDT_ID = ( SELECT DT 
                   FROM ALLTANT 
                   WHERE USER_ID = 'KKBE'  )
ORDER BY TestTable.DT

GROUP BY 是彙總前的分類

在針對欄位進行「取最大、取最小、加總、平均、計數」前將資料分類,每一組資料之間各自進行彙總計算

ORDER BY 是將最後查詢的結果,讓資料根據指定的欄位排序呈現

例如:我希望最後查詢出來的所有資料,依照TestTable的DT欄位升冪排序
所以 DT = K00100 的資料會在最上面,再來是DT = K00200 的資料

詳細說明可以參考我這次在鐵人賽的兩篇文章:

第二堂:家事管理 - 認識查詢 (FROM→WHERE→SELECT→ORDER BY)
https://ithelp.ithome.com.tw/articles/10216972

第三堂:家事管理 - 分類後統計資料(GROUP BY → HAVING→SELECT、Aggregrate Function)
https://ithelp.ithome.com.tw/articles/10217605

0
浩瀚星空
iT邦大師 1 級 ‧ 2019-10-09 01:35:46

GROUP BY一直以來都沒有所謂排序的功能,它只是幫你集合或統計處理而已。

所以不太確定你質問的問題在哪?

hyert iT邦新手 5 級 ‧ 2019-10-09 01:52:34 檢舉

抱歉 那要也要打聚合 前面有order by 突然就打錯了。

0
vincent_chu
iT邦新手 5 級 ‧ 2019-10-09 12:36:28

建議你這麼改…

Select * From (
	Select ID,

	USER.NAME,

	USER.DT,

	DT.PARENT_ID

	From USER 
	Join DT On USER.DT = DT.DT
) TestTable Where ALLDT_ID IN 
(
Select DISTINCT DT From ALLTANT Where USER_ID = 'KKBE'
)
GROUP BY DT, ID, NAME, PARENT_ID
ORDER BY DT

然後,其實我看不懂你的 "ALLDT_ID" 是什麼,也看不出來是屬於哪個 table 的。

這個查詢用了兩個子查詢,是因為 ALLTANT 上只有對 USER_ID 建 index 嗎?
為什麼不干脆 JOIN 3 個 table 就好了?

像這樣…

Select ID,
	USER.NAME,
	USER.DT,
	DT.PARENT_ID

	From USER 
	Join DT On USER.DT = DT.DT
    JOIN ALLTANT on ALLTANT.DT = ALLDT_ID --這欄位到
WHERE ALLTANT.USER_ID = 'KKBE'
GROUP BY USER.DT, USER.ID, USER.NAME, DT.PARENT_ID
ORDER BY USER.DT

其實有完整的 schema 會比較好回答,否則也不知道這樣的查詢會不會因為 schema 不是我預期而產生奇怪的結果。

我要發表回答

立即登入回答