Disons que j'ai deux tables:
Heures connues:
ChargeNum CatégorieID Mois Heures 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
Heures inconnues:
Mois de facturation Mois 111111 01/02/09 70 111111 3/1/09 40,5 222222 01/07/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 CatégorieID Heures 111111 1 90 111111 2 50 111111 Inconnu 110,5 222222 1 40 222222 Inconnu 25,5
Je n'arrive pas à comprendre cela. Toute aide serait grandement appréciée!
EDIT: Je dois faire la somme des heures pour chaque combinaison ChargeNum/Catégorie. J'ai mis à jour les exemples de données pour refléter cela.
Vous devrez utiliser UNION
pour combiner les résultats de deux requêtes. Dans ton 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 de lancer les deux requêtes séparément car il ne vérifie pas les doublons.
Dans la sortie attendue, la somme de l'avant-dernière ligne est incorrecte, elle devrait 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 les rangées combinées qui ont 50 heures ou plus ...
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
Alors j'ai 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 ...