दो अलग-अलग तिथियों के साथ अनुरोध - MySQL, एसक्यूएल, चयन, आंतरिक-शामिल

मुझे दो अलग-अलग तिथियों के साथ अनुरोध करने के लिए MySQL के साथ एक छोटी सी समस्या है।

मैं करने की जरूरत है nb_sales तथा last_sales 2014 तक लेकिन बारंबारता केवल पिछले वर्ष के लिए।

नतीजा मैं चाहता हूं:

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?

कॉलम 1-3 पहली तारीख सीमा में है: आज से 2014 तक
कॉलम 4 दूसरी तारीख सीमा में है: आज वाई-1 तक

तो मैंने कोशिश की:

  1. एक अस्थायी तालिका बनाएँ और डालें बारंबारता
  2. SELECT ग्राहक आईडी, ग्राहक पहचान, nb_sales, last_sales तथा बारंबारता साथ में LEFT OUTER JOIN

पहला कदम ठीक है लेकिन दूसरे के लिए मेरे पास कोई परिणाम या त्रुटि संदेश नहीं है ... और यह तब हुआ जब मैं चाहता था LEFT OUTER JOIN मेरी अस्थायी तालिका:

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

शायद आपके पास एक बेहतर विचार है?

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 ;

उत्तर:

जवाब के लिए 0 № 1

मुझे अंत में एक समाधान मिला है।
आपकी मदद के लिए वास्तव में धन्यवाद :)

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;

संबंधित सवाल
सबसे लोकप्रिय