簡體   English   中英

SQL語法問題-分組依據-Oracle

[英]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;
  1. 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM