Mam dwie tabele: BUILDING i APARTMENT .

Budynek ma ID_BUILDING, BUILDING_NAME (i to właśnie na to pytanie)

Mieszkanie ma ID_BUILDING, N_APARTMENTS, TOTAL_ROOMS.

Muszę zrobić coś takiego:

| BUILDING NAME | TOTAL APARTMENTS | TOTAL APARTMENTS WITH 1 BEDROOM | TOTAL APARTMENTS WITH 2 BEDROOMS |
|---------------|------------------|---------------------------------|----------------------------------|
| BUILDING A    | 31               | 8                               | 0                                 
|_______________________________________________________________________________________________________|
| BUILDING B    | 20               | 14                              | 11                               
|________________________________________________________________________________________________________
| BUILDING C    | 41               | 90                              | 5                                
|________________________________________________________________________________________________________

Ilość sypialni może być pomiędzy 1 a 5.

Za to, że przyszedłem z zapytaniem whis:

SELECT E.BUILDING_NAME as "name", COUNT(D.N_APARTMENTS) "TOTAL APARTMENTS", (SELECT COUNT(D1.TOTAL_ROOMS) FROM APARTMENT D1 WHERE D1.TOTAL_ROOMS = 1)
FROM BUILDING E
JOIN APARTMENT D 
ON E.ID_BUILDING = D.ID_BUILDING    
GROUP BY E.E.BUILDING_NAME
ORDER BY E.BUILDING_NAME;

Niestety, liczy wszystkie apartamenty z 1 pokój, a nie przez BUILDING_NAME:

| BUILDING NAME | TOTAL APARTMENTS | TOTAL APARTMENTS WITH 1 BEDROOM |
|---------------|------------------|---------------------------------|
| BUILDING A    | 31               | 122                             |
| BUILDING B    | 20               | 122                             |
| BUILDING C    | 41               | 122                             |

Wypróbowałem odpowiedzi Oto i < href = "https://stackoverflow.com/questions/32119048/convert-multiple-sub-queries-to-on-join"> Tutaj ale nie są one do tego samego problemu.

Myślę, że rozwiązanie może używać wielu dołączy (lub dołączenia wewnętrznych), ale nie mogę znaleźć właściwej odpowiedzi.

Z góry dziękuję.

1
Francisco Ignacio Hoyos Armijo 23 listopad 2020, 00:31

1 odpowiedź

Najlepsza odpowiedź

Korzystanie z agregacji warunkowej:

SELECT E.BUILDING_NAME as "name", 
 COUNT(D.N_APARTMENTS) "TOTAL APARTMENTS", 
 SUM(CASE WHEN D.TOTAL_ROOMS = 1 THEN 1 ELSE 0 END) AS "TOTAL APARTMENTS WITH 1 BEDROOM"
FROM BUILDING E
JOIN APARTMENT D 
ON E.ID_BUILDING = D.ID_BUILDING    
GROUP BY E.E.BUILDING_NAME
ORDER BY E.BUILDING_NAME;
1
Lukasz Szozda 22 listopad 2020, 21:32