2017-08-30 3 views
0

Ich habe ein kleines Problem mit MySQL für eine Anfrage mit zwei verschiedenen Datumsbereichen.Anfrage mit zwei verschiedenen Datumsbereichen

brauche ich nb_sales und last_sales bis 2014 aber Frequenz haben nur für das vergangene Jahr.

Das Ergebnis ich will:

customer_id  | nb_sales | last_sales | frequence 
--------------------------------------------------------------- 
Customer ID  | Sales make by | How many days| How many sales 
       | the customer | since the | has been made 
       |    | last sales? | this year? 

Spalte 1-3 im ersten Datumsbereich sind: heute bis 2014
Säule 4 in einem seconde Datumsbereich: heute y-1

Also habe ich versucht zu:

  1. eine temporäre Tabelle erstellen und einfügen frequence
  2. SELECTcustomer_id, nb_sales, last_sales und frequence mit LEFT OUTER JOIN

Der erste Schritt ist in Ordnung, aber für die zweite habe ich kein Ergebnis oder Fehlermeldung ... Und dies geschah, als wollte ich meine temporäre Tabelle LEFT OUTER JOIN:

LEFT OUTER JOIN tmp_frequence 
    ON tmp_frequence.client_id = sales_flat_order.customer_id 

Vielleicht haben Sie eine bessere Idee?

CREATE TEMPORARY TABLE tmp_frequence (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    client_id INT, 
    frequence INT, 
    PRIMARY KEY (id) 
); 

INSERT INTO tmp_frequence (client_id, frequence) 
SELECT sales_flat_order.customer_id, COUNT(sales_flat_order.entity_id) 
FROM sales_flat_order 
WHERE sales_flat_order.created_at BETWEEN '2014-05-22 00:00:00' and '2017-07-31 23:59:59' 
GROUP BY sales_flat_order.customer_id; 

/* ------------------------------ */ 
SELECT 
-- * , 
sales_flat_order.customer_id customer_id, 
COUNT(sales_flat_order.entity_id) nb_sales, 
DATEDIFF("2017-07-31",DATE_FORMAT(MAX(sales_flat_order_item.created_at),"%Y-%m-%d")) last_sales, 
tmp_frequence.frequence frequence 

FROM adl_ec.sales_flat_order_item 
LEFT OUTER JOIN sales_flat_order 
    ON sales_flat_order.entity_id = sales_flat_order_item.order_id 
LEFT OUTER JOIN tmp_frequence 
    ON tmp_frequence.client_id=sales_flat_order.customer_id 

WHERE sales_flat_order_item.created_at BETWEEN '2014-05-22 00:00:00' and '2017-07-31 23:59:59' 
GROUP BY customer_id; 

DROP TABLE tmp_frequence ; 
+1

Ich weiß nicht, was Sie von meinem „Zeitlichkeit“, aber Ihre 'WHERE' Klausel Ihrer' LEFT JOIN' in einen 'INNER JOIN' verwandelt. Die Bedingungen der äußeren Tabelle müssen in der ON-Klausel für den äußeren Join enthalten sein, da die WHERE-Klausel ausgeführt wird, nachdem die NULL-Ergebnisse der äußeren Verknüpfung zurückgegeben wurden. Ansonsten habe ich wirklich keine Ahnung, was Sie tun möchten, um Hilfe anzubieten ... – Siyual

+1

müssen Daten Beispiel (und erwartete Ergebnisse) sehen – Horaciux

+1

Was bedeutet "nicht funktioniert"? Was funktioniert? Was soll dieser Code tun? Bitte lesen und handeln Sie auf [mcve]. Bild, dass du uns alles erklären musst, weil wir keine Ahnung haben, wovon du sprichst - weil wir es nicht tun. Auch "eine Anfrage mit zwei Zeitlichkeiten zu machen" macht keinen Sinn. Lies auch Textbuchdefinitionen von innerem Join und linkem Join. – philipxy

Antwort

0

Ich habe endlich eine Lösung gefunden.
Danke wirklich für Ihre Hilfe :)

DROP TABLE IF EXISTS tmp_frequence; 
CREATE TEMPORARY TABLE tmp_frequence (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    client_id INT, 
    recence INT, 
    frequence INT, 
    montant INT, 
    PRIMARY KEY (id) 
); 

INSERT INTO tmp_frequence (client_id, frequence) 
SELECT sales_flat_order.customer_id, COUNT(sales_flat_order.entity_id) 
FROM sales_flat_order 
WHERE sales_flat_order.created_at BETWEEN '2016-07-31 00:00:00' and '2017-07-31 23:59:59' 
GROUP BY sales_flat_order.customer_id; 


INSERT INTO tmp_frequence (client_id, recence, montant) 
SELECT 
sales_flat_order.customer_id, 
DATEDIFF("2017-07-31",DATE_FORMAT(MAX(sales_flat_order_item.created_at),"%Y-%m-%d")) recence, 
COUNT(sales_flat_order.grand_total) montant 

FROM adl_ec.sales_flat_order_item 
LEFT OUTER JOIN sales_flat_order ON sales_flat_order.entity_id = sales_flat_order_item.order_id 
AND sales_flat_order_item.created_at BETWEEN '2014-05-22 00:00:00' and '2017-07-31 23:59:59' 
AND qty_invoiced >0 
AND sales_flat_order_item.sku NOT LIKE '%abo%' 
AND sales_flat_order.total_qty_ordered < 5 

GROUP BY customer_id; 

SELECT tmp_frequence.client_id,MAX(tmp_frequence.recence) Recence,MAX(tmp_frequence.frequence) Frequence,MAX(tmp_frequence.montant) Montant 
FROM tmp_frequence 
GROUP BY tmp_frequence.client_id; 
Verwandte Themen