2016-05-03 5 views
0

Ich habe für ein bestimmtes Datum (Erstellungsdatum) den Umsatz von 4 Wochen vor und 4 Wochen nach (den Daten eine Notwendigkeit ist für jede Woche zu berechnen) berechnenAbfrage berechnen Daten +/- 4 Wochen ab einem bestimmten Datum

Mein Blocker ist die Artikelliste 4 Wochen vor der Woche für Woche und das gleiche für Wochen zu berechnen after.So ich diese Abfrage 8mal zu tun haben, das Datum

SELECT 
    product, 
    SUM(sales) 
FROM 
    Sales_table 
WHERE 
    DATA <= date - 1 
AND product IN (
    product1, 
    product2, 
    ...., 
    product10000 
); 

ich es für zu tun haben, zu ändern Datum-1, Datum-2 ..., Datum-4 und dann Datum + 1, ..., Datum + 4 (manchmal habe ich es für + zu tun/- 12 Wochen) und die gleiche Sache für views_table tun, damit es für 10K Produkte wie 48 Abfragen ist und es copuld Fehler in Werkbank zu generieren. Gibt es andere Möglichkeiten, dies zu tun? mit TMP-Tabellen zum Beispiel, und wie könnte ich die Abfrage schreiben. Vielen Dank.

Antwort

0

ich habe Ihre Abfrage wie folgt verwendet (unten). Die Tabellen, die ich verwende, sind P_Master und P_Master_Cat (Ich kann den ersten verwenden, da alle Informationen darauf existieren). Wenn ich die Abfrage ausgeführt habe ich folgendes Problem „Fehlercode: 1111. Ungültige Verwendung von Gruppenfunktion

SELECT p.sku_conf AS product 
, IFNULL(SUM(IF(t.date >= i.dt + INTERVAL -4 WEEK AND t.date < i.dt + INTERVAL -3 WEEK,t.ItemID,NULL)),0) AS `d-4` 
, IFNULL(SUM(IF(t.date >= i.dt + INTERVAL -3 WEEK AND t.date < i.dt + INTERVAL -2 WEEK,t.ItemID,NULL)),0) AS `d-3` 
, IFNULL(SUM(IF(t.date >= i.dt + INTERVAL -2 WEEK AND t.date < i.dt + INTERVAL -1 WEEK,t.ItemID,NULL)),0) AS `d-2` 
, IFNULL(SUM(IF(t.date >= i.dt + INTERVAL -1 WEEK AND t.date < i.dt + INTERVAL 0 WEEK,t.ItemID,NULL)),0) AS `d-1` 
, IFNULL(SUM(IF(t.date >= i.dt + INTERVAL 0 WEEK AND t.date < i.dt + INTERVAL 1 WEEK,t.ItemID,NULL)),0) AS `d+0` 
, IFNULL(SUM(IF(t.date >= i.dt + INTERVAL 1 WEEK AND t.date < i.dt + INTERVAL 2 WEEK,t.ItemID,NULL)),0) AS `d+1` 
FROM (SELECT '2016-01-06' AS dt) i 
JOIN P_Master_Cat p 
    ON p.sku_conf IN 
    ('OE599EL9', 
    'OE599EL86', 
    'OE599EL90', 
    'OE599EL75') 
LEFT JOIN P_Master t 
    ON t.SKUConf = p.sku_conf 
    AND t.date >= i.dt + INTERVAL -6 WEEK 
    AND t.date < i.dt + INTERVAL 6 WEEK 
GROUP BY p.sku_conf 
+0

Ich glaube nicht, Sie ** ** 'ItemID' summieren möchten. Die ursprüngliche Frage zeigt 'SUM (Umsatz)'. Der Ausdruck 'sku_config' erscheint nur in der GROUP BY-Klausel. Andere Referenzen sind 'sku_conf' ... wir können nur erraten, was die * tatsächlichen * Spalten in Ihren Tabellen sind. – spencer7593

+0

Ich hatte einen Fehler in meiner ursprünglichen Abfrage ... sollte ein Plus sein und kein Minus ... ** "+ INTERVAL -6 Woche" **. (oder könnte 'INTERVAL 6 WOCHE' sein.(Das Subtrahieren eines Negativs ist das Gleiche wie das Hinzufügen eines Positivs.) – spencer7593

+0

Ich habe die Details bearbeitet. Es funktioniert. Ich habe Zweifel, ich benutze '** Count (ItemID) **', um die Gesamtzahl der Artikel zu wissen. und Artikel wird nur 1 anzeigen (denke ich). Wie könnte ich das tun? und Wie kann ich '** SUM (Revenue) **' für jedes Produkt pro Woche hinzufügen? – java2dev

0

Verwenden Sie einfach ein Selbst mich hier die Ergebnisse

diese Abfrage
select t.date,sum(t1.sales) 
from Sales_table t join Sales_table t1 on 
    t1.date between date_add(t.date, interval -4 week) and 
    date_add(t.date, internal 4 week) 

Gebrauch zu bekommen Summe der Verkäufe erhalten aus der Zeit vor und nach vier Wochen

Wenn Sie die Details wollen für bestimmte Produkte der unten verwenden query (für Produkt weise Summe)

select t.date,sum(t1.sales) 
from Sales_table t join Sales_table t1 on 
    t.product=t1.product and 
    t1.date between date_add(t.date, interval -4 week) and 
    date_add(t.date, internal 4 week) 
1
SELECT p.id AS product 
    , IFNULL(SUM(IF(t.creation_date >= i.dt + INTERVAL -4 WEEK AND t.creation_date < i.dt + INTERVAL -3 WEEK,t.sales,NULL)),0) AS `d-4` 
    , IFNULL(SUM(IF(t.creation_date >= i.dt + INTERVAL -3 WEEK AND t.creation_date < i.dt + INTERVAL -2 WEEK,t.sales,NULL)),0) AS `d-3` 
    , IFNULL(SUM(IF(t.creation_date >= i.dt + INTERVAL -2 WEEK AND t.creation_date < i.dt + INTERVAL -1 WEEK,t.sales,NULL)),0) AS `d-2` 
    , IFNULL(SUM(IF(t.creation_date >= i.dt + INTERVAL -1 WEEK AND t.creation_date < i.dt + INTERVAL 0 WEEK,t.sales,NULL)),0) AS `d-1` 
    , IFNULL(SUM(IF(t.creation_date >= i.dt + INTERVAL 0 WEEK AND t.creation_date < i.dt + INTERVAL 1 WEEK,t.sales,NULL)),0) AS `d+0` 
    , IFNULL(SUM(IF(t.creation_date >= i.dt + INTERVAL 1 WEEK AND t.creation_date < i.dt + INTERVAL 2 WEEK,t.sales,NULL)),0) AS `d+1` 
    FROM (SELECT '2016-04-01' AS dt) i 
    JOIN products p 
    ON p.id IN 
     (product1 
     , product2 
     , ... 
     , product10000 
     ) 
    LEFT 
    JOIN Sales_table t 
    ON t.product_id = p.id 
    AND t.creation_date >= i.dt + INTERVAL -6 WEEK 
    AND t.creation_date < i.dt + INTERVAL 6 WEEK 
GROUP BY p.id 
+0

Dank es ist Arbeit für einige Produkte, aber wenn es eine riesige Liste meiner Werkbank untergeht. – java2dev

+0

Ich bin mir nicht ganz sicher, welches Verhalten "meine Werkbank untergeht" beschreibt. Ich schlage vor, Sie verwenden EXPLAIN, um den Abfrageausführungsplan anzuzeigen. Und ich schlage vor, Sie testen die Abfrage aus dem mysql-Kommandozeilen-Client. Wenn bei der Abfrage ein Problem auftritt (es ist nicht klar, auf welches Problem Sie stoßen), sollten Sie in Erwägung ziehen, die Abfrage mit einem kleineren Satz in der IN-Liste auszuführen. Oder führen Sie die Abfrage mit einer Produkt-ID gleichzeitig aus. Es ist nicht möglich, eine Lösung für das Problem vorzuschlagen, ohne zu wissen, was das eigentliche Problem ist. – spencer7593

+0

Meine Werkbank erzeugen die Fehler Verbindung Zeitüberschreitung, vielleicht meine Fragen nicht Optimales sind oder die Auflistung ich extrahieren müssen, ist huge.please thequery erzeugen Fehler „Ungültige Gruppe of use“. Ich habe versucht, es zu korrigieren, aber das Problem bleibt. Ich habe Produkte und Verkäufe in derselben Tabelle. Was ist die "Wo" -Rolle in der Abfrage? – java2dev

Verwandte Themen