2013-10-05 6 views
0

J'essaie d'obtenir le nombre d'enregistrements d'une table où une colonne correspond à une autre colonne dans une table 2nd. J'ai alors besoin des valeurs totales d'une autre colonne qu'il a sélectionnée.Sélectionnez parmi 2 tables et obtenez les totaux

SELECT 
    h.holiday_id, 
    h.holiday_name, 
    CONVERT(Money,b.total_balance) AS total_balance, 
    b.booking_status_id, 
    Sum(CONVERT(Money,b.total_balance)) AS total_balance, 
    Count(*) AS record_count 
FROM 
    [arend].[aren1002].[HOLIDAY_REF] AS h, 
    [arend].[aren1002].[BOOKING] AS b 
LEFT JOIN 
    [arend].[aren1002].[BOOKING] 
ON 
    h.holiday_id=booking.holiday_id 
WHERE 
    b.booking_status_id = '330' AND h.holiday_id = b.holiday_id 
ORDER BY h.holiday_id 

Table 1 HOLIDAY_REF 
holiday_id | holiday_name 
1 | Italy 
2 | Russia 
3 | Spain 

Table 2 BOOKING 
holiday_id | booking_status_id | total_balance 
1 | 330 | 2500 
3 | 330 | 1500 
1 | 330 | 1750 
2 | 330 | 1240 
2 | 330 | 5600 

Results: 
Holiday_id | holiday_name | total_balance | record_count 
1 | Italy | 4250 | 2 
2 | Russia | 6840 | 2 
3 | Spain | 1500 | 1 

Je ne suis pas sûr d'y aller de la bonne façon. MISE À JOUR: J'ai mis à jour la commande sql pour refléter où je dois aller, j'ai maintenant une erreur: L'identifiant en plusieurs parties "h.holiday_id" n'a pas pu être lié.

Répondre

1

Je ne comprends pas vraiment pourquoi il faut rejoindre une table deux fois.

Comment utiliser GROUP BY, il donnera le résultat que vous attendez pour le SUM et COUNT.

Quelque chose comme

SELECT 
    h.holiday_id, 
    Sum(CONVERT(Money,b.total_balance)) AS total_balance, 
    Count(*) AS record_count 
FROM 
    [arend].[aren1002].[HOLIDAY_REF] AS h, 
    [arend].[aren1002].[BOOKING] AS b 
WHERE 
    b.booking_status_id = '330' AND h.holiday_id = b.holiday_id 
GROUP BY h.holiday_id 
ORDER BY h.holiday_id 
0

SQL fonctionne avec des résultats:

select * from HOLIDAY_REF 

donne le tableau ci-dessus

select * from BOOKING 

donne l'autre tableau ci-dessus

select * from HOLIDAY_REF a, BOOKING b where a.holiday=b.holiday give a combined table 

donc - et c'est prob votre truc un

select * from ( 
    select * from HOLIDAY_REF a, BOOKING b where a.holiday=b.holiday gove a combined table 
) 

donne le même ResultSet, mais ..

vous pouvez faire quelque chose comme

select * from ( 
    select * from HOLIDAY_REF a, BOOKING b where a.holiday=b.holiday gove a combined table 
) where b.booking_status_id = '330' and a..... what ever 

choisissent chacun donne une nouvelle petite table pour sélectionner

la syntaxe correcte dépend de votre base de données

1

Je veillerais vous stockez total_balance que l'argent de sorte que vous n'avez pas à convertir lors de l'affichage des données.

Même si vous utilisez une jointure à gauche, en vérifiant que booking_status_id = '330', toutes les entrées dans Holiday_Ref seront exclues sans une entrée de réservation correspondante avec le statut '330'. Si c'est le comportement souhaité, vous pouvez le rendre plus explicite et utiliser une jointure interne.

Dans votre requête actuelle, vous avez sélectionné plus de colonnes que dans le jeu de résultats souhaité. Voici ce que je pourrais suggérer:

select 
    holiday_ref.holiday_id 
    ,holiday_ref.holiday_name 
    ,sum(booking.total_balance) as total_balance 
    ,count(1) as record_count 
from 
    holiday_ref 
inner join 
    booking 
on holiday_ref.holiday_id = booking.holiday_id 
where 
    booking.booking_status_id = '330' 
group by 
    holiday_ref.holiday_id 
    ,holiday_ref.holiday_name 
Questions connexes