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.

Était-ce utile?

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top