2017-07-20 1 views
1

J'ai deux tables différentes partageant les mêmes noms de colonnes. Les tableaux listent les mêmes produits identifiés par 'id'. Les produits ont des revenus différents dans les deux tableaux et sont répertoriés plusieurs fois dans chaque tableau.SQL - Ordre par somme de plusieurs tables partageant le champ commun

Je voudrais additionner le revenu des mêmes produits à travers les 2 tables et ORDER BY la somme. Le résultat consiste à trier les produits à revenus les plus élevés en premier.

J'ai essayé JOIN et UNION mais je n'arrive pas à trouver la bonne solution.

UNION requête J'ai essayé ...

SELECT id, SUM(rev) as total 
FROM (
     SELECT id, rev FROM table1 UNION ALL 
     SELECT id, rev FROM table2 UNION ALL 
) 
ORDER BY total DESC 

REJOIGNEZ requête J'ai essayé ...

SELECT table1.id, 
     table1.rev, 
     table2.id, 
     table2.rev, 
     (table1.rev + table2.rev) as revenue 
FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
ORDER BY revenue DESC 
+0

Est-ce que ID et REV sont identiques pour les deux tables? – scsimon

+0

Utilisez-vous MySQL ou Microsoft SQL Server? Veuillez supprimer l'étiquette non pertinente. –

+0

Les ID sont les mêmes dans les deux tables et répertoriés plusieurs fois dans chaque. Le rev est différent sur la ligne. –

Répondre

0

On dirait que vous avez juste besoin de groupe sur l'ID puis ... à moins que je suis Il manque quelque chose.

select d.* from (
SELECT 
    table1.id, 
    Sum(table1.rev) + Sum(table2.rev) as revenue 
FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
GROUP BY 
    table1.id) d 
order by d.revenue 
+0

Inner Join ne fonctionne que si les deux tables ont tous les ID. Si des tables sont manquantes, vous avez besoin d'une jointure FULL externe. –

+0

Oui, c'est vrai à @PaulChernoch, mais OP saturé * Je voudrais additionner le revenu des ** mêmes produits ** sur les 2 tables * – scsimon

0
SELECT id, SUM(rev) as total 
FROM (
     SELECT id, rev FROM table1 UNION ALL 
     SELECT id, rev FROM table2 
) 
GROUP BY id 
ORDER BY total DESC 
+0

Merci pour cet extrait de code, qui peut fournir une aide immédiate. Une explication appropriée [améliorerait considérablement] (// meta.stackexchange.com/q/114762) sa valeur éducative en montrant * pourquoi * ceci est une bonne solution au problème, et le rendrait plus utile aux futurs lecteurs avec des semblables, mais pas identique, des questions. S'il vous plaît [modifier] votre réponse pour ajouter une explication, et donner une indication des limites et des hypothèses qui s'appliquent. –

1

Vous étiez près. Vous aviez besoin de:

  1. un UNION ALL, pas deux.

  2. un GROUP BY, qui donne le champ break.

  3. Un alias pour la sous-requête (je AllRevenue -. Vous pouvez utiliser un nom valide)

 
    SELECT id, SUM(rev) as total 
    FROM (
      SELECT id, rev FROM table1 UNION ALL 
      SELECT id, rev FROM table2 
    ) AS AllRevenue 
    GROUP BY id 
    ORDER BY total DESC 

L'approche conjointe aurait travaillé si vous avez utilisé un FULL OUTER JOIN, parce que certains ids peut être présent dans une table mais pas dans l'autre, mais c'est généralement moins performant.

+0

merci @PaulChernoch –