SELECT
s.symbol,
SUM(CASE WHEN c.city = 'gdynia' THEN 1 ELSE 0 END) AS 'gdynia',
SUM(CASE WHEN c.city = 'poznan' THEN 1 ELSE 0 END) AS 'poznan',
SUM(CASE WHEN c.city = 'warszawa' THEN 1 ELSE 0 END) AS 'warszawa'
FROM
stock AS s WITH (nolock)
LEFT JOIN stock AS c WITH (nolock)
ON
s.symbol = c.symbol AND
s.city = c.city
GROUP BY
s.symbol
;
Ale dlaczego tak? Pobierz normalnie count(*) zgrupowany po nazwie (dwie kolumny). Pivota zrób w PHP za pomocą tabeli asocjacyjnej. Jak pisałem na górze - SQL nie służy do wymyślnego formatowania danych, szkoda zasobów. Generalnie zasada jest taka, że bazę tyka się jedynie patykiem, najmniej jak można. Serwerów aplikacyjnych możesz mieć ile chcesz, bazę masz jedną.
Jeśli masz aplikację pod Windows to całkiem niezłym pomysłem jest trzymanie logiki biznesowej w bazie danych, bardzo łatwo się to modyfikuje a klient jest maksymalnie prosty.