Donc, j'ai 3 tables

Table H

hotelNo | hotelName

H1 | Greenslopes
H2 | Wynsor
H3 | Red Hills

>Table R

roomNo |hotelNo | price
R1 | H1 | 60
R2 | H1 | 50
R3 | H1 | 75
R4 | H1 | 120
R5 | H1 | 95
R1 | H2 | 85
R2 | H2 | 45
R3 | H2 | 90
R4 | H2 | 80
R5 | H2 | 100
.
.
.

>Table B

hotelNo | roomNo
H1 | R1
H2 | R1
H3 | R1
H4 | R2
H5 | R4
H1 | R3
H2 | R1
H3 | R2
H4 | R2
H5 | R3
H1 | R1
H2 | R5
H3 | R1
H4 | R5
H5 | R1
.
.
.

Maintenant, je dois obtenir le prix total des R que H1 a dans le tableau B

La réponse devrait être quelque chose comme

hotelNo | Total
H1      | ###

Et c'est ce que j'ai essayé:

SELECT B.hotelNo, sum(R.price)
FROM B
INNER JOIN R
    ON B.hotelNo = R.hotelNo
WHERE B.hotelNo = 'H1';

Mais ça ne marche pas. Il résume tout à partir du tableau R

Ensuite, j'ai essayé ceci (n'a pas fonctionné non plus):

SELECT B.hotelNo, B.roomNo + (SELECT sum(R.price)
                                FROM R
                                WHERE B.hotelNo = R.hotelNo) as TotalPrice
FROM B
WHERE B.hotelNo = 'H1';

Aidez-moi s'il vous plaît!

1
EddSoul24 29 août 2020 à 16:26

2 réponses

Meilleure réponse

Si votre requête ne fonctionne pas, une condition supplémentaire est peut-être manquante dans la clause ON:

SELECT b.hotelNo, SUM(r.price) total_price
FROM Booking b JOIN Room r
ON b.hotelNo = r.hotelNo AND b.roomNo = r.roomNo
WHERE b.hotelNo = 'H1'
GROUP BY b.hotelNo -- you can omit this line in SQLite

Voir la démo.
Résultat (pour vos exemples de données):

| hotelNo | total_price |
| ------- | ----------- |
| H1      | 195         |
1
forpas 29 août 2020 à 13:49

Cette requête doit faire ce que vous voulez:

SELECT b.hotelNo, sum(r.price)
FROM Booking b INNER JOIN
     Room r
     ON b.hotelNo = r.hotelNo
WHERE b.hotelNo = 'H1';

Bien qu'il soit mal formé (parce que la colonne non agrégée dans SELECT n'est pas dans GROUP BY), SQLite peut l'accepter. Je préfère utiliser un GROUP BY explicite:

SELECT b.hotelNo, sum(r.price)
FROM Booking b JOIN
     Room r
     ON b.hotelNo = r.hotelNo
WHERE b.hotelNo = 'H1'
GROUP BY b.hotelNo;
0
Gordon Linoff 29 août 2020 à 13:29