Результаты GROUP BY сгруппированного запроса - PullRequest
0 голосов
/ 27 февраля 2019

Используются следующие таблицы:

CREATE TABLE IF NOT EXISTS planta(
codigo int PRIMARY KEY NOT NULL AUTO_INCREMENT,
especialidad varchar(25) NOT NULL
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS habitacion(
id int PRIMARY KEY NOT NULL AUTO_INCREMENT,
numero_camas int NOT NULL,
planta_id int NOT NULL,
FOREIGN KEY (planta_id) REFERENCES planta(codigo)
)ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS paciente(
dni varchar(9) PRIMARY KEY NOT NULL,
num_ss varchar(10) NOT NULL,
nombre varchar(20) NOT NULL,
direccion varchar(50) NOT NULL,
tratamiento mediumtext NOT NULL,
diagnostico mediumtext NOT NULL,
habitacion_id int NOT NULL,
medico_id int NOT NULL,
FOREIGN KEY (habitacion_id) REFERENCES habitacion(id),
FOREIGN KEY (medico_id) REFERENCES medico(num_colegiado)
)ENGINE=InnoDB;

Запрос такой:

SELECT planta.codigo AS Floor_id, habitacion.id AS Room_id, numero_camas - count(dni) AS Free_beds 
FROM habitacion, paciente, planta 
WHERE planta_id = planta.codigo AND habitacion_id = habitacion.id 
GROUP BY planta.codigo, habitacion.id;

Возвращает результаты:

Floor id | Room id | Free beds
    1         1          1    
    1         2          1    
    2         3          3

Но я хочу это:

Floor id | Rooms | Free beds
    1        2         2    
    2        1         3    

Я думаю, что у меня много проблем, потому что сначала я должен подсчитать, сколько кроватей свободно в каждой комнате (я делаю это, вычитая количество кроватей в комнате минус людей, которыеназначен в эту комнату).

Мне было интересно, можно ли каким-либо образом сгруппировать результаты, полученные по текущему запросу.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Основываясь на ответе Гордона Линоффа и вашем утверждении, я полагаю, что с этими незначительными изменениями вы должны получить правильный результат (я думаю, нужно подсчитать отдельные комнаты и сложить количество кроватей за вычетом назначенных людей.вверх):

SELECT 
     pl.codigo AS Floor_id,  
     count(distinct habitacion_id) as num_rooms, 
     SUM(numero_camas - count(dni)) AS Free_beds 
FROM habitacion h 
join paciente p on p.habitacion_id = h.id 
join condition planta pl on h.planta_id = pl.codigo 
GROUP BY pl.codigo
0 голосов
/ 28 февраля 2019

Вам нужно два агрегата: количество спальных мест в расчете на одно жилье, а затем сумма доступных спальных мест на этаж.Один из способов сделать это:

select planta_id, count(*) as rooms, sum(available - occupied) as free_beds
from
(
  select
    planta_id,
    h.id as habitacion_id,
    numero_camas as available,
    (select count(*) from paciente p where p.habitacion_id = h.id) as occupied
  from habitacion h
) habitation_aggregated
group by planta_id
order by planta_id;

Вы видите, что у меня есть подзапрос в предложении FROM, который представляет агрегацию.Это очень хороший и безопасный способ справиться с несколькими агрегатами.

0 голосов
/ 27 февраля 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Вам просто нужна правильная GROUP BY логика.Я думаю, что это так

SELECT pl.codigo AS Floor_id, count(count distinct h.id) as num_rooms,
       MAX(numero_camas) - count(distinct h.id) AS Free_beds 
FROM habitacion h join
     paciente p
     on p.habitacion_id = h.id   -- just a guess that this is the right join condition
     planta pl
     on h.planta_id = pl.codigo
GROUP BY pl.codigo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...