1.我們要篩選的數據為去除 GX 列的重復項 並將所有數據展示出來,如圖所示:
1 select t.* from [PeopleCount] as t where t.procedureID='8334'
2.這種情況下我們是不可以使用DISTINCT來去重的,我們可以來嘗試一下:
首先,單純的查詢 GX 這一列用 distinct 是沒有任何問題的
1 select distinct t.GX from [PeopleCount] as t where t.procedureID='8334'
但是如果我們加上表中其它數據的話,我們來看看效果:
1 select distinct t.GX ,t.* from [PeopleCount] as t where t.procedureID='8334'
很顯然,結果發現不是我們想要的數據。
3.這個時候我們既想要去重,又想要去重后的數據,我們可以這樣:
select t.* from [PeopleCount] as t where t.procedureID='8334' and not exists (select 1 from [PeopleCount] where procedureID='8334' and GX=t.GX and countID>t.countID)
這就是將GX過濾去重后查詢到的所有數據了。
備注: ①.EXISTS (sql 返回結果集為真) NOT EXISTS(sql 不返回結果集為真(或返回結果集為假))
②.EXISTS表示存在量詞:帶有EXISTS的子查詢不返回任何記錄的數據,只返回邏輯值“True”或“False”
③.相關子查詢執行過程:先在外層查詢中取“[PeopleCount]表”的第一行記錄,用該記錄的相關的屬性值(在內層WHERE子句中給定的)處理內層查詢,若外層的WHERE子句返回“TRUE”值,則這條記錄放入結果表中。然后再取下一行記錄;重復上述過程直到外層表的記錄全部遍歷一次為止。
④.EXISTS語句不關心子查詢的具體內容,因此用“SELECT *”,“Exists + 子查詢”用來判斷該子查詢是否返回記錄。
⑤.Exists:若子查詢的結果集非空時,返回“True”;若子查詢的結果集為空時,返回“False” 。
NOT EXISTS :若子查詢結果為空,返回“TRUE”值;若子查詢的結果集非空時,返回 “FALSE。
4.對查詢到的結果(DJ列) 如果在不為空的情況下進行求和:
1 select 2 ISNULL((Select sum(DJ) as CountNum FROM [PeopleCount] t WHERE type = 1 and t.procedureID='8334' and not exists 3 (select 1 from [PeopleCount] where procedureID='8334' and GX=t.GX and countID>t.countID)),0) as 求和結果
備注:①.isnull(參數1,參數2),判斷參數1是否為NULL,如果是,返回參數2,否則返回參數1。
②.SUM()
函數用於計算一組值或表達式的總和,SUM()
函數的語法如下:SUM(DISTINCT expression)
轉自:https://www.cnblogs.com/guozhaoxin/p/11888591.html