2017-05-17 1 views
0

Ich brauche Ihre Hilfe, ich habe zwei Tabellen Verkauf und Kauf, meine Anforderung ist, das Ergebnis von Verkauf und Kauf in der gleichen Spalte, wenn der Monat ist gleich. Ich verwende den folgenden Code.Php Wie UNION Ergebnis in der gleichen Spalte

<?php 
$stmt = $db->prepare("SELECT SUM(amount) as amount, 
    DATE_FORMAT(saledate,'%M %Y') as saledate, 
    null as recovery 
    FROM `advertisercv` GROUP BY DATE_FORMAT(saledate, '%M %Y') 
UNION all 
SELECT null, 
    DATE_FORMAT(date,'%M %Y') as date, 
    SUM(amount) 
    FROM `paymentsrec` 
    GROUP BY DATE_FORMAT(date, '%M %Y')"); 
?> 

Ergebnis:

S.No Month  Sale  Recovery 
1 April-2016  10000  
2 April-2016    4000  
2 January-2017 5000  
3 January-2017   3000 

erwartete Ergebnis ist:

S.No Month  Sale  Recovery 
1 April-2016  10000 4000  
2 January-2017 5000 3000 
+0

Können Sie Ihr Tabellenschema angeben? Ist Saledate vom Typ TIMESTAMP oder DATETIME? Scheint auch, dass Ihr Code anfällig für SQL-Injection ist, sollten Sie vorbereitete Anweisungen berücksichtigen. – lloiacono

+0

Anstelle einer Union sollten Sie ein JOIN-Datum und jede andere Spalte verwenden, die die Zeilen in Beziehung setzt. (Kundennummer?) –

Antwort

0

Durch eine mit links verbinden, können Sie die Zeilen in den beiden Tabellen übereinstimmen. Ich schlage vor, einen linken Join zu verwenden, da in der ersten Tabelle möglicherweise Zeilen vorhanden sind, die in der zweiten Tabelle keine übereinstimmenden Zeilen enthalten. Die folgende Abfrage zeigt alle Zeilen in advertisecv mit Summen für übereinstimmende Zeilen in paymentsrec. Die if-Funktion ersetzt fehlende Zeilendaten mit Null, damit die Summenfunktion korrekt funktioniert.

Ich habe auch eine weitere Spalte nur als ein Beispiel für das, was Sie tun können, wenn Sie den Join zwischen Spalten verwenden, die sich in verschiedenen Tabellen befinden.

SELECT 
    DATE_FORMAT(a.`saledate`,'%M %Y') as `saledate`, 
    SUM(a.`amount`) as `Sale`, 
    SUM(IF(b.`amount` IS NULL,0,b.`amount`)) as `Recovery` 
    SUM(a.`amount`) - SUM(IF(b.`amount` IS NULL,0,b.`amount`)) as `Balance Outstanding` 
FROM `advertisercv` a 
LEFT JOIN `paymentsrec` b 
ON DATE_FORMAT(a.`saledate`,'%M %Y) = DATE_FORMAT(b.`saledate`,'%M %Y') 
GROUP BY DATE_FORMAT(a.`saledate`,'%Y %m') 
ORDER BY DATE_FORMAT(a.`saledate`,'%Y %m') 
+0

Was meinst du damit ??? –

Verwandte Themen