2017-08-30 9 views
0

2つの異なる日付範囲でリクエストするためにMySQLに少し問題があります。2つの異なる日付範囲でリクエストする

私は2014年までnb_saleslast_salesを持っているだけで、過去年間の度数する必要があります。

結果は、私が欲しい:1-3の最初の日付の範囲内にある

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? 

コラム:今日の2014
4列にはseconde日付範囲である:今日まで、Y-1

一時テーブルを作成し、度数を挿入

  1. :だから私はしようとしました
  2. SELECTCUSTOMER_IDLEFT OUTER JOIN

最初のステップはOKですが、1秒間私がどんな結果やエラーメッセージが表示されていないとnb_saleslast_sales度数 ...そして、私は一時テーブルを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 ; 
+1

私はあなたが何を意味知っていないため、本当にありがとうございますが、あなたの 'WHERE'節は' INNER JOIN'にあなたの 'LEFT JOIN'を変換されます。 'WHERE'節は外部結合の' NULL'結果が返された後*実行されるので、外部表の条件は外部結合の 'ON'節に含まれる必要があります。それ以外に、私は実際に助けを提供するために何をしようとしているのか分かりません... – Siyual

+1

データサンプルを見る必要があります(そして期待される結果) – Horaciux

+1

"うまくいかない"とはどういう意味ですか? 「働く」とは何ですか?このコードは何をするはずですか? [mcve]を読んで行動してください。あなたが何を話しているのかわからないので、私たちにすべてを説明する必要があるイメージです。私たちはそうしないからです。また、「2つの時間的に要求する」ことは意味をなさない。また、内部結合と左結合のテキスト定義を読んでください。 – philipxy

答えて

0

私は最後に解決策を見つけました。
は「一時的に」あなたの助け:)

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; 
関連する問題