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,也並沒有相加
求解
另外有Distinct不能與Sum 共用嗎?同一select語句裡面
Group by 不用加A.WEIGHT_SUM
Group by C.Src_CompanyNm,A.SRC_DEPARTMENT,C.Src_DepartmentNm,A.DELIVER_DATE
把【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不行。
WEIGHT_SUM 在這一欄位裡面
select 出來是根據條件是6,7個數據
小數型別
你下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
彙總函式會根據一組值來執行計算,並傳回單一值,必需搭配Group by使用,是用來將查詢結果中依據Group by欄位相同的資料分為多個群組,將Sum()函式中的數值進行運算。
Distinct是用來易除重覆值使用,透過Group by也可以達成相同結果。
另外Distinct也可以運用在彙總函式中,如:Count(distinct 訂單編號),這個部份可以在多筆訂單交易中找出唯一訂單編號筆數。
你應該是想要這樣...
第一次先過濾重複的,然後再去計算值的加總..
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