web-dev-qa-db-fra.com

Combinez deux tables pour une sortie

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.

46
Matthew Jones

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.

81
lc.

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
11
BenAlabaster

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

1
AccessProgrammer