[英]SQL Syntax Issue - Group By - Oracle
雖然我知道標題不是很具體,我深表歉意,但我需要有關SQL的語法問題的幫助,而且由於我不太確定錯誤的語法部分,因此我無法更具體。
如果有幫助,我正在使用Oracle SQL Developer。
SELECT DISTINCT pet.PET_NAME,
CASE
WHEN dog.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Dog'
WHEN cat.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Cat'
ELSE ''
END AS "Pet Type",
SUM(res.RESERVATION_START_DATE - res.RESERVATION_END_DATE) AS "Days Stayed"
FROM HVK_PET pet, HVK_DOG dog, HVK_CAT cat, HVK_RESERVATION res, HVK_PET_RESERVATION petRes
WHERE (pet.PET_NUMBER = dog.PET_PET_NUMBER
OR pet.PET_NUMBER = cat.PET_PET_NUMBER)
AND res.RESERVATION_NUMBER = petRes.RES_RESERVATION_NUMBER
AND petRes.PET_PET_NUMBER = pet.PET_NUMBER
GROUP BY pet.PET_NAME, dog.pet_pet_number, cat.pet_pet_number;
是我完整的代碼,前7行用黃色下划線標出,建議在我的group by語句中添加CASE。 我不是SQL方面的佼佼者,因此,如果顯而易見,請立即致電給我。
SELECT pet.PET_NAME,
CASE
WHEN dog.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Dog'
WHEN cat.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Cat'
ELSE ''
END AS "Pet Type",
SUM(res.RESERVATION_START_DATE - res.RESERVATION_END_DATE) AS "Days Stayed"
FROM HVK_PET pet, HVK_DOG dog, HVK_CAT cat, HVK_RESERVATION res, HVK_PET_RESERVATION petRes
WHERE (pet.PET_NUMBER = dog.PET_PET_NUMBER OR pet.PET_NUMBER = cat.PET_PET_NUMBER)
AND res.RESERVATION_NUMBER = petRes.RES_RESERVATION_NUMBER
AND petRes.PET_PET_NUMBER = pet.PET_NUMBER
GROUP BY pet.PET_NAME,
CASE
WHEN dog.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Dog'
WHEN cat.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Cat'
ELSE ''
END;
按dog.pet_pet_number, cat.pet_pet_number
分組, dog.pet_pet_number, cat.pet_pet_number
因為您的CASE在select中以不適合GROUP BY的方式轉換結果。
我想您不需要DISTINCT,因為此關鍵字已應用於選擇列表中的所有表達式,因此在您的情況下使用它是沒有意義的(分組時已經沒有重復符號)
有兩種方法:
1。
GROUP BY pet.PET_NAME,
CASE
WHEN dog.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Dog'
WHEN cat.PET_PET_NUMBER = pet.PET_NUMBER THEN 'Cat'
ELSE ''
END;
INLINE
視圖。 這里有一個類似的問題, 如何基於Oracle中的Case語句使用Group By?
首先,您不需要select distinct
。 group by
幾乎不需要這種構造。
如您所寫, case
語句的問題在於它提到了三列,但是group by
只有兩列。 該缺少的列是pet.PET_NUMBER
。 您可以通過將其添加到group by
,但是可以使用更簡單的方法來編寫查詢。
關鍵是要解決join
語法,而不是使用隱式連接:
SELECT pet.PET_NAME,
MAX(CASE WHEN dog.PET_PET_NUMBER IS NOT NULL THEN 'Dog' ELSE 'CAT' END) AS "Pet Type",
SUM(res.RESERVATION_START_DATE - res.RESERVATION_END_DATE) AS "Days Stayed"
FROM HVK_PET pet JOIN
HVK_PET_RESERVATION petRes
ON petRes.PET_PET_NUMBER = pet.PET_NUMBER JOIN
HVK_RESERVATION res
ON res.RESERVATION_NUMBER = petRes.RES_RESERVATION_NUMBER LEFT JOIN
HVK_DOG dog
ON pet.PET_NUMBER = dog.PET_PET_NUMBER LEFT JOIN
HVK_CAT cat
ON pet.PET_NUMBER = cat.PET_PET_NUMBER
GROUP BY pet.PET_PET_NUMBER, pet.PET_NAME;
left join
帶入額外的列 ,而不是行,因此您將擁有“ dog”列和“ cat”列。 這些可以很容易地在SELECT
邏輯中使用。 假設給定的寵物是狗還是貓,但絕不是兩者,則查詢僅使用MAX()
而不在group by
中包括其他列。
從join
條件中刪除or
可以提高性能。
如果你正在學習SQL,學習正確的ANSI風格join
語法。 一個簡單的規則:請勿在from
子句中使用逗號。
行駛和可讀性的另一個答案。 從您的寵物開始,然后通過LEFT-JOIN加入狗或貓的桌子,只能在其中一張桌子中找到。 如果您允許其他寵物入住(鳥類,爬行動物等),您也可以在這些表中添加更多“ LEFT JOIN”並調整case / when子句。
所以,這種情況/何時。 如果發現狗的寵物編號匹配,那就太好了,就像“狗”一樣。 如果沒有,那就嘗試“貓”吧……如果沒有,那么您就擁有了其他(或將來的任何其他寵物類型)。
為了澄清起見,我添加了pet_number,這也是您小組中的一部分...如果您有不止一只名為“ Lightning”的寵物(快狗或貓,每只都有不同的寵物號),沒有歧義怎么辦。
另外,對於分組依據,我正在主要寵物的寵物編號列上進行。 它是否可以在狗或貓表中找到它無關緊要……無論在哪個表中找到它,數字都是唯一的。
最后,刪除了區別。 由於您是按每個寵物編號/名稱分組並進行匯總,因此不會根據生成的寵物類型重復任何數據...
SELECT
pet.PET_NAME,
pet.PET_NUMBER,
CASE WHEN dog.PET_PET_NUMBER IS NOT NULL THEN 'Dog'
WHEN cat.PET_PET_NUMBER IS NOT NULL THEN 'Cat'
ELSE '' END AS "Pet Type",
SUM(res.RESERVATION_START_DATE - res.RESERVATION_END_DATE) AS "Days Stayed"
FROM
HVK_PET pet
LEFT JOIN HVK_DOG dog
ON pet.PET_NUMBER = dog.PET_PET_NUMBER
LEFT JOIN HVK_CAT cat
ON pet.PET_NUMBER = cat.PET_PET_NUMBER
JOIN HVK_PET_RESERVATION petRes
ON pet.PET_NUMBER = petRes.PET_PET_NUMBER
JOIN HVK_RESERVATION res
ON petRes.RES_RESERVATION_NUMBER = res.RESERVATION_NUMBER
GROUP BY
pet.PET_NAME,
pet.PET_NUMBER;
但是,如果Oracle表示您不是所有列都不是該分組依據的一部分,因為您沒有按寵物類型進行分組……並且該寵物類型不會因特定寵物編號而改變,則只需更改到一個
MAX( case/when ) as PetType
(最后,我討厭嘗試使用帶有嵌入式空格的列。這可能會導致您可能不會想到的問題,尤其是如果您忘記“引用”它們的時候。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.