Anfrage mit zwei verschiedenen Datumsbereichen - mysql, sql, select, inner-join

Ich habe ein kleines Problem mit MySQL, um eine Anfrage mit zwei verschiedenen Datumsbereichen zu stellen.

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

Das Ergebnis möchte ich:

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?

Die Spalten 1-3 sind im ersten Datumsbereich: heute bis 2014
Spalte 4 befindet sich in einem zweiten Datumsbereich: heute bis y-1

Also habe ich versucht:

  1. Erstellen Sie eine temporäre Tabelle und fügen Sie sie ein Frequenz
  2. SELECT Kundennummer, nb_sales, letzte_sale und Frequenz mit LEFT OUTER JOIN

Der erste Schritt ist in Ordnung, aber für den zweiten habe ich kein Ergebnis oder eine Fehlermeldung ... Und das passierte, als ich es wollte LEFT OUTER JOIN mein temporärer Tisch:

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

Vielleicht hast du 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 ;

Antworten:

0 für die Antwort № 1

Ich habe endlich eine Lösung gefunden.
Vielen Dank für deine 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;