Oracle
初學者 SQL:來自 GROUP BY 的意外結果
我有一張
sidewalk_deficiency
桌子:create table sidewalk_deficiency ( def_id number(10), insp_id number(10), def_length number(10,2)); insert into sidewalk_deficiency values (10,1,.5); insert into sidewalk_deficiency values (11,1,1); insert into sidewalk_deficiency values (12,1,1.5); insert into sidewalk_deficiency values (13,2,2); insert into sidewalk_deficiency values (14,2,2.5); commit; DEF_ID INSP_ID DEF_LENGTH ---------- ---------- ---------- 10 1 .5 11 1 1 12 1 1.5 13 2 2 14 2 2.5
我可以創建一個查詢,通過計算每次檢查的缺陷長度來總結人行道檢查:
select insp_id, sum(def_length) as def_length from sidewalk_deficiency group by insp_id INSP_ID DEF_LENGTH ---------- ---------- 1 3 2 4.5
**這正如我所料。**輸出兩行;每個人一個
insp_id
。我知道上面的查詢確實提供了所需的輸出。但是,我真的不明白為什麼它會以這種方式工作。
def_length
誠然,當我編寫這樣的查詢時,將欄位包括在聚合函式和group by
子句中對我來說更有意義。對我來說,我知道我想把它折疊def_length
成一個總和,所以在我看來我應該按它分組。select insp_id, sum(def_length) as def_length from sidewalk_deficiency group by insp_id, def_length --<<--Problem INSP_ID DEF_LENGTH ---------- ---------- 2 2.5 1 .5 1 1 2 2 1 1.5
當然,正如我們所看到的,我的思維過程是有缺陷的。當我在 中包含該
def_length
欄位時group by
,它產生的記錄比我預期的要多。原諒我的無知,但為什麼第二個查詢比第一個查詢產生更多的結果?我會認為在聚合函式中包含該欄位,並且會
group by
按照我的計劃對行進行分組。
這個答案與其他答案有點不同,但我理解您的問題與“在 SELECT 和 GROUP BY 之間添加/刪除列的邏輯是什麼”更相關。如果不合適,請告訴我,我會刪除。
這並不是真正的怪癖,它只是聚合的基本規則。如果我計算住在我家的人(總共 3 個),我會計算住在我地址的人。所以我可以說
SELECT Address ,COUNT(PersonID) AS PeopleCount FROM Household GROUP BY Address
這將給我在我的地址的人數。
如果我嘗試按名稱進行操作:
SELECT Address Name ,COUNT(PersonID) AS PeopleCount FROM Household GROUP BY Address ,Name
然後它會在人數中給我一個“1”值,因為我家中每個名字的每個地址只有 1 個人。
如果我家有 2 個同名的人,那麼這兩個人的“PeopleCount”值將是“2”,直到我找到要添加的其他內容以使記錄獨一無二。
因此,您將項目添加到 SELECT/GROUP BY 的原因是基於 UNIQUE 記錄執行聚合。添加到 SELECT 語句的列越多,記錄的唯一性就越高。