2016-04-28 13 views
0

Ich habe diese Tabelle von Aufträgenberechnen Summe für Gruppendatensätzen in MySQL

| ORDER_ID | PRODUCT | CUSTOMER | QTY | DATE 
--------------------------------------------- 
|  1 | shoes | Nick | 1 | 01/01/2016 
|  2 | shirts | Nick | 5 | 02/02/2016 
|  3 | shoes | Paul | 10 | 03/03/2016 
|  4 | shirts | Paul | 20 | 04/04/2016 

Also, wie kann ich diesen Bericht Ergebnis mit ONE Select Statement erreichen?

| Date_of_Order | Customer | Quantity | PRODUCT_TOTAL_SALES | 
----------------------------------------------------------------- 
| 01/01/2016 | Nick  |  1  |  shoes : 11  | 
| 02/02/2016 | Nick  | 10  |  shirts : 25  | 
| 03/03/2016 | Paul  |  5  |  shoes : 11  | 
| 04/04/2016 | Paul  | 20  |  shirts : 25  | 

Ich weiß, wie concat(column1, ' ', column2) zu verwenden, um eine kombinierte Spalte zu erstellen, aber ich habe es nicht geschafft eine Summe für ein gruppierte Element hinzuzufügen. Wenn ich mit linkem Join versuche, bekomme ich die Summe für ein Produkt ... ABER es ist immer die ganze Summe und es bezieht sich nicht auf die Daten der Bestellung, also wenn ich versuche, die Ergebnisse für eine bestimmte Zeit auf meine Anfrage zu filtern 11 für Schuhe und 25 für Hemden ...

+0

Willkommen bei Stack-Überlauf. Ich formatierte Ihre Tabellen ein wenig - Sie können immer markieren Sie Text und verwenden Sie die '{}' Editor-Symbolleiste Schaltfläche oder 'ctl-k', um es als Code-Block zu formatieren, die gilt, Fixed-mit, Syntaxhervorhebung wo anwendbar, und vermeidet extra Zeilenumbrüche. –

+0

können Sie auch die Abfrage hinzufügen, die den Bericht und den Bericht generiert hat, den Sie erhalten möchten? –

Antwort

0

Sie können group by mehrere Spalten und erhalten Sie die Summe für die kleinste Gruppe.

Wenn Sie den täglichen Verkauf wollen, dann statt GROUP BY product Verwendung GROUP BY product, date

SELECT 
    o.`date` AS Date_of_Order, 
    SUM(o.qty) as Total_Quantity, 
    CONCAT(o.product, ':', SUM(o.qty)) 
FROM 
    orders o 
GROUP BY product, `date` 
ORDER BY `date` 
+1

Ich denke, ich gruppiere nach mehreren Spalten. Können Sie den Code teilen, der das erwartete Ergebnis liefert (und die Summe wird relativ zu irgendwelchen gefilterten Daten sein?) – Sam

+0

das ist inkompatibel mit 'sql_mode = only_full_group_by' – mitkosoft

+0

@mitkosoft was macht Sie denken? –

0

Einfache zusätzliche SELECT aus derselben Tabelle kann man erkennen, für ganze Zeit tun:

SELECT 
    o.`date` AS Date_of_Order, 
    o.Customer, 
    o.qty as Quantity, 
    (SELECT 
      CONCAT(oo.product, ':', SUM(oo.qty)) 
     FROM 
      orders oo 
     WHERE 
      oo.product = o.product 
    ) PRODUCT_TOTAL_SALES 
FROM 
    orders o 

Ausgang:

+---------------+----------+----------+---------------------+ 
| Date_of_Order | Customer | Quantity | PRODUCT_TOTAL_SALES | 
+---------------+----------+----------+---------------------+ 
| 01/01/2016 | Nick  |  1 | shoes:11   | 
| 02/02/2016 | Nick  |  5 | shirts:25   | 
| 03/03/2016 | Paul  |  10 | shoes:11   | 
| 04/04/2016 | Paul  |  20 | shirts:25   | 
+---------------+----------+----------+---------------------+ 
4 rows in set 

Wenn Sie nach certa filtern möchten in der Periode, müssen Sie es in beide gehören:

SELECT 
    o.`date` AS Date_of_Order, 
    o.Customer, 
    o.qty as Quantity, 
    (SELECT 
      CONCAT(oo.product, ':', sum(oo.qty)) 
     FROM 
      orders oo 
     WHERE 
      oo.product = o.product 
      AND STR_TO_DATE(oo.`date`,'%d/%m/%Y') BETWEEN '2016-01-01' AND '2016-03-03' 
    ) PRODUCT_TOTAL_SALES 
FROM 
    orders o 
WHERE 
    STR_TO_DATE(o.`date`,'%d/%m/%Y') BETWEEN '2016-01-01' AND '2016-03-03' 

Ausgang:

+---------------+----------+----------+---------------------+ 
| Date_of_Order | customer | Quantity | PRODUCT_TOTAL_SALES | 
+---------------+----------+----------+---------------------+ 
| 01/01/2016 | Nick  |  1 | shoes:11   | 
| 02/02/2016 | Nick  |  5 | shirts:5   | 
| 03/03/2016 | Paul  |  10 | shoes:11   | 
+---------------+----------+----------+---------------------+ 
3 rows in set 
+0

So habe ich es bis jetzt gemacht ... aber die Sache ist, dass ich es irgendwie innerhalb der inneren Auswahlanweisung nicht filtern kann, weil der Filter, den der Benutzer benutzt, auf irgendeinem anderen AJAX/Diagramm ist Skript, das die Tabelle auf der Seite präsentiert und ich versuche, das mit nur einem Filter auf der letzten Spalte .. auf der vorgestellten Tabelle zu erreichen. Ich denke ich muss als Datum das Datum des inneren "select" haben ... – Sam