Grupowanie pp typach i zwrócenie ilości nieprzeczytanych powiadomień

0

Witam
Mam taką tabelę, gdzie są wpisy o ogłoszeniach i userach, którzy je już widzieli

Mam zapytanie w Oracle Db które zwraca userowi liczbę nieprzeczytanych ogłoszeń typu "Sale"

SELECT 
  (
    SELECT 
      COUNT(*) 
    FROM 
      ANNOUNCEMENTS 
    WHERE 
      TYPE = 'Sale' 
      AND USER_ID IS NULL
  ) 
  - 
  (
    SELECT 
      COUNT(*) 
    FROM 
      ANNOUNCEMENTS 
    WHERE 
      TYPE = 'Sale' 
      AND USER_ID = 33
  ) 
FROM DUAL

To zapytanie zwraca poprawne wyniki. Dlaczego tak, a nie inaczej to raczej nie ważne (są jeszcze inne kolumny).
Takie samo zapytanie można zrobić dla ogłoszeń typu "Advertisement", "Public" itd.

Chciałbym aby jednym zapytanie z GROUP BY można było zwrócić listę typów i ilość nieprzeczytanych przez usera (przy użyciu powyższego zapytania)

Czyli teraz zwraca np. samą liczbę: 21
To potem powinno być:

Sale | 21
Advertisement | 15
Public | 31

itd.

Czy ktoś może pomóć to zrobić? Próbowałem zrobić różne warianty w stylu:

SELECT 
  TYPE,
  (
    SELECT 
      COUNT(*) 
    FROM 
      ANNOUNCEMENTS 
    WHERE 
      USER_ID IS NULL
  ) 
  - 
  (
    SELECT 
      COUNT(*) 
    FROM 
      ANNOUNCEMENTS 
    WHERE 
      USER_ID = 33
  ) 
GROUP BY TYPE
FROM DUAL

ale w ogóle jest niepoprawne składniowo

1

Nie do końca wiem, z czego tu wynika fakt "nieprzeczytania", ale można zrobić tak.

SELECT TYPE, COUNT(CASE WHEN USER_ID IS NULL THEN 1 ELSE NULL END) - COUNT(CASE WHEN USER_ID = 33 THEN 1 ELSE NULL END) CNT
FROM 
  ANNOUNCEMENTS 
GROUP BY 
  TYPE

screenshot-20230530214930.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1