Jeśli appt.kod pochodzi z innej tabeli to trzeba to zrobić LEFT/RIGHT OUTER JOIN.
Natomiast jeśli appt.kod to zwykłe pole tabeli, to trzeba robić pewien trik, który spowoduje że pod uwagę weźmie wartości, o których baza nie ma pojęcia (jest to pokazane niżej).
Być może lepszym wyjściem będzie parametryzowanie tego zapytania do konkretnego appt.kod tak aby zwracał liczbę tego co jest potrzeba tj. coś takiego:
SELECT
kod,
COUNT(*)
FROM
appt
WHERE kod = 'Komorniki'
GROUP BY
kod
Co oznacza daj mi liczbę wszystkich wystąpień 'Komorniki', jeśli zwróci NULL znaczy że 0 i trzeba to obsłużyć z backendu. Jednak jeśli potrzeba Ci jest zbudować listę wszystkich na raz to strzelanie do bazy aby wykonało takie zapytanie dla wszystkich możliwych kodów nie jest dobre. Jeśli ma to być pojedyncze pobranie (tzn. dla konkretnego kodu) wtedy takie coś ma sens.
Haks żeby było 'Komorniki': 0, ale to jest bez sensu według mnie i lepszym wyjściem jest zrobienie osobnej tabeli na kody, która będzie miała wszystkie możliwe kody i zrobienie LEFT/RIGHT JOIN'a
Można to zrobić takim haksem:
SELECT
k.value `Kod`,
COUNT(appt.kod)
FROM
(
SELECT DISTINCT
kod AS `value`
FROM
appt
UNION
SELECT
'Komorniki'
) AS k
LEFT OUTER JOIN appt ON appt.kod = k.value
GROUP BY
k.value
Podzapytanie:
SELECT DISTINCT
kod AS `value`
FROM
appt
UNION
SELECT
'Komorniki'
Tworzy listę wszystkich wartości w polu appt.kod dodając do niego wartość 'Komorniki' której tam nie ma.