Combinez deux tables pour une sortie
Question
Disons que j'ai deux tables:
Heures connues:
ChargeNum CategoryID Month Hours 111111 1 2/1/09 10 111111 1 3/1/09 30 111111 1 4/1/09 50 222222 1 3/1/09 40 111111 2 4/1/09 50
UnknownHours:
ChargeNum Month Hours 111111 2/1/09 70 111111 3/1/09 40.5 222222 7/1/09 25.5
Je dois regrouper ces heures, en ignorant Month, dans un seul tableau de données, afin que le résultat attendu soit le suivant:
ChargeNum CategoryID Hours 111111 1 90 111111 2 50 111111 Unknown 110.5 222222 1 40 222222 Unknown 25.5
Je n'arrive pas à comprendre cela. Toute aide serait grandement appréciée!
EDIT: Je dois additionner les heures pour chaque combinaison ChargeNum / Catégorie. J'ai mis à jour les exemples de données pour refléter cela.
La solution
Vous devez utiliser UNION
pour combiner les résultats de deux requêtes. Dans votre cas:
SELECT ChargeNum, CategoryID, SUM(Hours)
FROM KnownHours
GROUP BY ChargeNum, CategoryID
UNION ALL
SELECT ChargeNum, 'Unknown' AS CategoryID, SUM(Hours)
FROM UnknownHours
GROUP BY ChargeNum
Remarque - Si vous utilisez UNION ALL
comme ci-dessus, il n'est pas plus lent que d'exécuter les deux requêtes séparément car cela ne vérifie pas les doublons.
Autres conseils
Dans la sortie attendue, la somme de l'avant-dernière ligne est incorrecte, elle doit correspondre à 40 en fonction des données de vos tables, mais voici la requête:
Select ChargeNum, CategoryId, Sum(Hours)
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
Et voici la sortie:
ChargeNum CategoryId
---------- ---------- ----------------------
111111 1 40
111111 2 50
111111 Unknown 70
222222 1 40
222222 Unknown 25.5
Pouvons-nous aller un peu plus loin et dire que je ne veux voir que des lignes combinées qui ont 50 heures ou plus ... / p>
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (SumHours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
J'ai donc essayé
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (Hours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
Mais cela ne donne pas la somme des heures sur les deux tables ...