Вопрос SQL о комбинировании различных показателей в запросе - PullRequest
0 голосов
/ 03 ноября 2018

Я только начинаю проект базы данных для своего института в Oracle SQL Developer, и у меня возникают проблемы с первым запросом, в котором я должен вернуть «название здания», «общее количество отделов», «количество "отделы с 1 комнатой", "количество отделений с 2 ​​комнатами" и т. д. до 5 комнат.

Пока у меня есть это:

    select  E.EDI_NOMBRE_EDIFICIO as "NOMBRE EDIFICIO",
            count(D.NRO_DEPARTAMENTO) as "TOTAL DEPTOS",
            (
             select count(D.NRO_DEPARTAMENTO) as "TOTAL DEPTOS 1 DORMITORIO"
             from (edificio E join departamento D 
             on E.id_edificio = D.ID_EDIFICIO)
             where D.TOTAL_DORMITORIOS = 1
             group by E.EDI_NOMBRE_EDIFICIO
            ) AS "DEPTOS 1 DORM"        
    from (edificio E join departamento D on E.id_edificio = D.ID_EDIFICIO)
    group by E.EDI_NOMBRE_EDIFICIO
    order BY E.EDI_NOMBRE_EDIFICIO;

Проблема в том, что я хорошо получаю первые 2 столбца, но подзапрос, который я использую для получения общего числа отделов с 1 комнатой, выдает ошибку 01427, потому что (я думаю) я ставлю многострочный подзапрос в предложении SELECT.

Я не знаю, как подойти к правильному запросу, если он не использует подзапрос в предложении Select. Буду очень признателен, если кто-нибудь из вас сможет мне помочь. Заранее спасибо.

Это мой второй семестр на уроках программирования, поэтому я почти ничего не знаю. На самом деле, я только что прочитал вопрос и ответ «Объединение результатов различных count (*) SQL запросов», и я не понимаю.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Решил это так:

SELECT  E.EDI_NOMBRE_EDIFICIO as "NOMBRE EDIFICIO",
         (
         SELECT COUNT(D.NRO_DEPARTAMENTO)         
         FROM departamento D 
         WHERE E.id_edificio = D.ID_EDIFICIO
         ) AS "TOTAL DEPTOS",
         (
          SELECT COUNT(D.NRO_DEPARTAMENTO) AS "TOTAL DEPTOS 1 DORMITORIO"
          FROM departamento D
          WHERE D.TOTAL_DORMITORIOS = 1
          AND D.id_edificio = E.id_edificio
         ) AS "DEPTOS 1 DORM",
         (
          SELECT COUNT(D.NRO_DEPARTAMENTO)
          AS "TOTAL DEPTOS 1 DORMITORIO"
          FROM departamento D
          WHERE D.TOTAL_DORMITORIOS = 2
          AND D.id_edificio = E.id_edificio
         ) AS "DEPTOS 2 DORM",
         (
          SELECT COUNT(D.NRO_DEPARTAMENTO)
          AS "TOTAL DEPTOS 1 DORMITORIO"
          FROM departamento D
          WHERE D.TOTAL_DORMITORIOS = 3
          AND D.id_edificio = E.id_edificio
         ) AS "DEPTOS 3 DORM",
         (
          SELECT COUNT(D.NRO_DEPARTAMENTO)
          AS "TOTAL DEPTOS 1 DORMITORIO"
          FROM departamento D
          WHERE D.TOTAL_DORMITORIOS = 4
          AND D.id_edificio = E.id_edificio
         ) AS "DEPTOS 4 DORM",
         (
          SELECT COUNT(D.NRO_DEPARTAMENTO)
          AS "TOTAL DEPTOS 1 DORMITORIO"
          FROM departamento D
          WHERE D.TOTAL_DORMITORIOS = 5
          AND D.id_edificio = E.id_edificio
         ) AS "DEPTOS 5 DORM"
FROM EDIFICIO E
ORDER BY E.EDI_NOMBRE_EDIFICIO ASC;
0 голосов
/ 06 ноября 2018

Ваш ответ может быть более убедительным, если вы сначала сгруппируете результаты из таблицы departamento, так как тогда вы будете запрашивать таблицу один раз, а не 6 раз для id_edificio, например:

SELECT e.edi_nombre_edificio AS "NOMBRE EDIFICIO",
       d.total_deptos AS "TOTAL DEPTOS",
       d.deptos_1_dorm AS "DEPTOS 1 DORM",
       d.deptos_2_dorm AS "DEPTOS 2 DORM",
       d.deptos_3_dorm AS "DEPTOS 3 DORM",
       d.deptos_4_dorm AS "DEPTOS 4 DORM",
       d.deptos_5_dorm AS "DEPTOS 5 DORM"
FROM   edificio e
       INNER JOIN (SELECT id_edificio,
                          COUNT(nro_departamento) total_deptos,
                          COUNT(CASE WHEN total_dormitorios = 1 THEN nro_departamento END) deptos_1_dorm,
                          COUNT(CASE WHEN total_dormitorios = 1 THEN nro_departamento END) deptos_2_dorm,
                          COUNT(CASE WHEN total_dormitorios = 1 THEN nro_departamento END) deptos_3_dorm,
                          COUNT(CASE WHEN total_dormitorios = 1 THEN nro_departamento END) deptos_4_dorm,
                          COUNT(CASE WHEN total_dormitorios = 1 THEN nro_departamento END) deptos_5_dorm
                   FROM   departamento) d ON e.id_edificio = d.id_edificio;
0 голосов
/ 04 ноября 2018

Как насчет замены подзапроса на:

Sum(Case when D.TOTAL_DORMITORIOS = 1 then 1 else 0 end) as "DEPTOS 1 DORM" 

... И так далее

Sum(Case when D.TOTAL_DORMITORIOS = 2 then 1 else 0 end) as "DEPTOS 2 DORM"
Sum(Case when D.TOTAL_DORMITORIOS = 3 then 1 else 0 end) as "DEPTOS 3 DORM" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...