2012-11-24 7 views
1

J'ai deux tables, de vente etcombiner deux tables dans une sortie SQL

par exemple

vente:

sales_date  Amount 
2012-11-01  12000.55 
2012-11-03  2650.00 
2012-11-03  2650.00 
2012-11-03  2650.00 
2012-11-07  12900.00 
2012-11-07  2900.00 

Dépenses:

Expense Date  Amount 
2012-11-03   40.00 
2012-11-10  100.00 
2012-11-10  1000.00 
2012-11-11   10.00 
2012-11-17  100.00 

J'ai besoin de requête SQL sortie comme

Date    Sales  Expense 
2012-11-01  12000.55 
2012-11-03  7950.00   40.00 
2012-11-07  15800.00 
2012-11-10      1100.00 
2012-11-11      10.00 
2012-11-17      100.00 
+0

Quelle est la relation FK entre les tables? Il peut nécessiter une opération JOIN –

Répondre

0

Ce que vous avez besoin est un FULL OUTER JOIN:

SELECT COALESCE(E.Date, S.Date) AS Date, 
     SUM(S.Amount) AS Sales, 
     SUM(E.Amount) AS Expenses 
    FROM Expenses AS E 
    FULL OUTER JOIN Sales AS S 
    ON E.Date = S.Date 
GROUP BY COALESCE(E.Date, S.Date); 

qui est standard SQL; nous devons maintenant savoir si MySQL le supporte. Malheureusement, comme le note le commentateur, MySQL ne prend pas en charge FULL OUTER JOIN.

Dans ce cas, vous devez simuler FULL OUTER JOIN avec UNION LEFT OUTER JOIN et RIGHT OUTER JOIN:

SELECT E.Date AS Date, SUM(S.Amount) AS Sales, SUM(E.Amount) AS Expenses 
    FROM Expenses AS E 
    LEFT OUTER JOIN Sales AS S 
    ON E.Date = S.Date 
GROUP BY E.Date 
UNION 
SELECT S.Date AS Date, SUM(S.Amount) AS Sales, SUM(E.Amount) AS Expenses 
    FROM Expenses AS E 
RIGHT OUTER JOIN Sales AS S 
    ON E.Date = S.Date 
GROUP BY S.Date; 
+1

mais le problème est que 'MySQL' ne supporte pas' FULL OUTER JOIN' –

+0

merci beaucoup, la première requête ne supporte pas dans mysql, la seconde a bien fonctionné – imsome1

+0

J'ai un problème, quand je lance la requête , le '2012-11-03' il devrait y avoir 3 enregistrements de 2650.00 mais je reçois seulement un enregistrement et quand je résume les montants je reçois 7950.00 et dépenses 120.00 (cela devrait être 40.00) – imsome1

0

Vous devez une jointure externe complète. Si mysql ne le supporte pas, regardez here pour une solution de contournement possible

+0

cheers mate pour le soutien – imsome1

1

Une requête imbriquée avec un UNION ALL vous donnera ce dont vous avez besoin; d'abord obtenir toutes les lignes de ventes et toutes les lignes de dépenses séparément, puis GROUP en les rangs communs par date;

SELECT date, FLOOR(SUM(s)) AS sales, FLOOR(SUM(e)) AS expense 
FROM 
(
    SELECT sales_date AS date, amount AS s, 0 AS e FROM sales 
    UNION ALL  
    SELECT expensedate AS date, 0 AS s, amount AS e FROM expense 
) AS individual_rows 
GROUP BY date 
ORDER BY date; 

Les s FLOOR de » peut être omis si vous ne voulez pas d'arrondi (le résultat semble indiquer que vous faites)

SQLfiddle demo.

+0

merci beaucoup M. Genius, votre requête m'a donné les résultats attendus. – imsome1

Questions connexes