2
votes

GROUP BY résultats d'une requête groupée

J'essaie de sélectionner le nombre de lits gratuits par étage et le nombre de chambres dans lesquelles ces lits existent. Je pense que j'ai des problèmes car je dois d'abord calculer le nombre de lits disponibles dans chaque chambre, ce que je fais en soustrayant le nombre de lits dans la chambre moins les personnes qui y sont affectées.

Peut Je GROUP BY la requête en cours de manière à obtenir le résultat souhaité?

Les tableaux utilisés sont les suivants:

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

La requête est la suivante:

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

Elle renvoie ce résultat:

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;

Mais je veux ceci:

XXX


2 commentaires

Lorsque vous traitez avec plusieurs tables, qualifiez toujours toutes les colonnes. Quelle table contient numero_camas ? Quel dni ? Veuillez non seulement afficher les résultats, mais également ce que contiennent les tableaux séparés.


@ThorstenKettner Merci pour vos commentaires, Kettner. Maintenant, j'ai ajouté les tables qui appartiennent à cette requête.


3 Réponses :


1
votes

N'utilisez jamais de virgule dans la clause FROM . Toujours utilisez une syntaxe appropriée, explicite, standard JOIN .

Vous avez juste besoin de la logique GROUP BY correcte. Je pense que c'est comme ça

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


2 commentaires

Merci, Gordon. J'ai essayé la solution, mais je n'obtiens toujours pas le résultat correct. En ce moment, j'obtiens: Floor id = 1, num rooms = 3, free beds = 0 et Floor id = 2, num rooms = 1, free beds = 3 . Je pense que cela pourrait avoir à faire quelque chose avec le calcul du nombre de lits gratuits, même si je ne suis pas entièrement sûr.


Mise à jour: J'ai vérifié que vous aviez modifié le code dans la réponse. Maintenant, cela fonctionne parfaitement. Je continuerai à m'améliorer et j'essaierai de bien comprendre la solution que vous avez fournie. Merci beaucoup.



0
votes

Sur la base de la réponse de Gordon Linoff et de votre déclaration, je suppose qu'avec ces changements mineurs, vous devriez obtenir le résultat correct (je suppose que les pièces distinctes doivent être comptées et le nombre de lits moins les personnes attribuées doit être additionné up):

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 commentaires

0
votes

Vous avez besoin de deux agrégations: le nombre de lits par habitation, puis la somme des lits disponibles par étage. Une façon de faire est:

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;

Vous voyez que j'ai une sous-requête dans la clause FROM qui représente une agrégation. C'est un moyen très efficace et sûr de gérer plusieurs agrégations.


0 commentaires