首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >分组依据分组查询的结果

分组依据分组查询的结果
EN

Stack Overflow用户
提问于 2019-02-28 04:24:39
回答 2查看 53关注 0票数 2

我正在尝试选择每层楼有多少张免费床位,以及这些床位所在的房间数。我想我有麻烦了,因为我首先必须计算每个房间有多少张空床,我是通过减去房间里的床位数减去分配到该房间的人数来计算的。

我能以一种达到预期结果的方式GROUP BY当前的查询吗?

使用的表格如下:

代码语言:javascript
复制
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;

查询是这样的:

代码语言:javascript
复制
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;

它返回以下结果:

代码语言:javascript
复制
Floor id | Room id | Free beds
    1         1          1    
    1         2          1    
    2         3          3

但我想要的是:

代码语言:javascript
复制
Floor id | Rooms | Free beds
    1        2         2    
    2        1         3    
EN

回答 2

Stack Overflow用户

发布于 2019-02-28 05:40:13

根据戈登·林诺夫和yor的回答,我想通过这个小的改变,你应该得到正确的结果(我想需要计算不同的房间,需要计算床位数减去分配的人数):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-28 06:10:12

您需要两个汇总:每个居所的床位数,然后是每个楼层的可用床位总数。实现这一点的一种方法是:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54913904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档