iT邦幫忙

0

SQL 語法裡面的 DISTINCT ,Sum

  • 分享至 

  • xImage
SELECT  DISTINCT C.Src_CompanyNm,A.SRC_DEPARTMENT,C.Src_DepartmentNm,A.DELIVER_DATE,sum (A.WEIGHT_SUM)  FROM TRRDCB12 A LEFT JOIN TRRDCB05 B
 ON A.DISPOSE_CODE = B.MethId LEFT JOIN TRRDCB07 C ON A.SRC_DEPARTMENT = C.Src_Department
  WHERE C.Src_CompanyNm = '台北' AND c.Src_DepartmentNm = 'PABS' AND
   A.DISPOSE_CATEGORY_CODE LIKE 'B%' AND A.DISPOSE_CODE = 'D-0299' AND A.DELIVER_DATE BETWEEN '2019/01/01 00:00:00' AND '2019/01/31 23:59:59'

訊息 8120,層級 16,狀態 1,行 1
資料行 'TRRDCB07.Src_CompanyNm' 在選取清單中無效,因為它並未包含在彙總函式或 GROUP BY 子句中。

我一定要下GROUP By嗎?
可是我下完後

SELECT  DISTINCT C.Src_CompanyNm,A.SRC_DEPARTMENT,C.Src_DepartmentNm,A.DELIVER_DATE,sum (A.WEIGHT_SUM)  as sum  FROM TRRDCB12 A LEFT JOIN TRRDCB05 B
 ON A.DISPOSE_CODE = B.MethId LEFT JOIN TRRDCB07 C ON A.SRC_DEPARTMENT = C.Src_Department
  WHERE C.Src_CompanyNm = '台北' AND c.Src_DepartmentNm = 'PABS' AND
   A.DISPOSE_CATEGORY_CODE LIKE 'B%' AND A.DISPOSE_CODE = 'D-0299' AND A.DELIVER_DATE BETWEEN '2019/01/01 00:00:00' AND '2019/01/31 23:59:59'
   Group by  C.Src_CompanyNm,A.SRC_DEPARTMENT,C.Src_DepartmentNm,A.DELIVER_DATE,A.WEIGHT_SUM

這一個欄位,A.WEIGHT_SUM,也並沒有相加
求解/images/emoticon/emoticon02.gif

另外有Distinct不能與Sum 共用嗎?同一select語句裡面

:)
rainnet iT邦新手 5 級 ‧ 2019-02-24 13:29:19 檢舉
你的語法中有2個問題
1. 寫了group by 就不用再寫distinct
2.group by 的位置不用再寫A.WEIGHT_SUM欄位
小魚 iT邦大師 1 級 ‧ 2019-02-24 14:12:48 檢舉
你查一下GROUP BY 的語法,
為什麼要用GROUP BY,
還有你問之前最好先說一下是哪種SQL,
雖然看起來像MS-SQL...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
allenlwh
iT邦高手 1 級 ‧ 2019-02-23 17:15:50

Group by 不用加A.WEIGHT_SUM

Group by  C.Src_CompanyNm,A.SRC_DEPARTMENT,C.Src_DepartmentNm,A.DELIVER_DATE
ted8224 iT邦新手 5 級 ‧ 2019-02-23 18:04:39 檢舉

我沒加跳錯 語法錯連跑畫面都不能

clcy iT邦新手 3 級 ‧ 2019-02-26 09:10:47 檢舉

你可能先貼出沒加跳錯的訊息出來讓大家看看比較容易了解。
一般要作sum是要把沒有要sum的欄位放group by, 要sum的欄位在select 後面加sum函數。
ex:
select a, b, sum(c) as c
from table_a
group by a, b

0
張小馬~
iT邦新手 3 級 ‧ 2019-02-23 17:53:29

把【A.WEIGHT_SUM】放在group by,可見沒有了解group by的意思:
把所有「相同的內容」合併成一個(不是加總成一個)。

為什麼WEIGHT_SUM沒有加總?首先它的內容不同,不會都剛好是同一個數字,所以select完會把所有不同的數字列出來;其次是縱使剛好都是同一個數字,select完也只會把它併成唯一那個數字(而不是加總成另外一個數字)。

既然不同也不行、相同也不行,因此答案就是:
不要把你想要加總的數字,放在group by的位置。




除此之外,題外話,可以參考我這篇的最後一段,SQL迴圈實作 -1.慣用寫法,複製如下:

五、信仰 group by! 遠離 distinct!
能 group by 的,絕對不會寫成distinct!
在你的SQL人生中,可以沒有distinct,但不可能沒有group by吧?

事實上我覺得distinct是一種取巧,可以運用在當你想要快速了解某個欄位時;但若一份資料是以資料清洗和資料採礦為目標,擁有多個欄位,那distinct用起來是很不踏實的,尤其是有類似SUM, AVG等聚合運算出現時,group by絕對可以解決所有邏輯運算的概念問題,但distinct不行。

ted8224 iT邦新手 5 級 ‧ 2019-02-23 18:06:20 檢舉

WEIGHT_SUM 在這一欄位裡面
select 出來是根據條件是6,7個數據
小數型別

  1. 最前面distinct拿掉
  2. 最後面A.WEIGHT_SUM拿掉

你下distinct是為了讓這四個欄位有唯一值(合併時),group by本身就已經是這個功能,不需要再下distinct。要被運算的數字欄位,也不會放在 group by (我原本回答的內容主要就是在講這件事)。

SELECT
C.Src_CompanyNm,
A.SRC_DEPARTMENT,
C.Src_DepartmentNm,
A.DELIVER_DATE,
sum (A.WEIGHT_SUM) as sum 
FROM TRRDCB12 A 
LEFT JOIN TRRDCB05 B
ON A.DISPOSE_CODE = B.MethId
LEFT JOIN TRRDCB07 C
ON A.SRC_DEPARTMENT = C.Src_Department
WHERE C.Src_CompanyNm = '台北' 
AND C.Src_DepartmentNm = 'PABS'
AND A.DISPOSE_CATEGORY_CODE LIKE 'B%'
AND A.DISPOSE_CODE = 'D-0299'
AND A.DELIVER_DATE BETWEEN '2019/01/01 00:00:00'
AND '2019/01/31 23:59:59'
Group by
C.Src_CompanyNm,
A.SRC_DEPARTMENT,
C.Src_DepartmentNm,
A.DELIVER_DATE
0
rainnet
iT邦新手 5 級 ‧ 2019-02-23 18:32:43

彙總函式會根據一組值來執行計算,並傳回單一值,必需搭配Group by使用,是用來將查詢結果中依據Group by欄位相同的資料分為多個群組,將Sum()函式中的數值進行運算。
Distinct是用來易除重覆值使用,透過Group by也可以達成相同結果。
另外Distinct也可以運用在彙總函式中,如:Count(distinct 訂單編號),這個部份可以在多筆訂單交易中找出唯一訂單編號筆數。

0
純真的人
iT邦大師 1 級 ‧ 2019-02-26 13:43:42

你應該是想要這樣...
第一次先過濾重複的,然後再去計算值的加總..

select Src_CompanyNm
,SRC_DEPARTMENT
,Src_DepartmentNm
,DELIVER_DATE
,Sum(WEIGHT_SUM) as [sum]
from (
	SELECT  C.Src_CompanyNm
	,A.SRC_DEPARTMENT
	,C.Src_DepartmentNm
	,A.DELIVER_DATE
	,A.WEIGHT_SUM 
	FROM TRRDCB12 A 
	LEFT JOIN TRRDCB05 B ON A.DISPOSE_CODE = B.MethId 
	LEFT JOIN TRRDCB07 C ON A.SRC_DEPARTMENT = C.Src_Department
	WHERE C.Src_CompanyNm = '台北' 
	AND c.Src_DepartmentNm = 'PABS' 
	AND A.DISPOSE_CATEGORY_CODE LIKE 'B%' 
	AND A.DISPOSE_CODE = 'D-0299' 
	AND A.DELIVER_DATE 
	BETWEEN '2019/01/01 00:00:00' AND '2019/01/31 23:59:59'
	group by C.Src_CompanyNm
	,A.SRC_DEPARTMENT
	,C.Src_DepartmentNm
	,A.DELIVER_DATE
	,A.WEIGHT_SUM 
) as k
group by Src_CompanyNm
,SRC_DEPARTMENT
,Src_DepartmentNm
,DELIVER_DATE

我要發表回答

立即登入回答