2017-11-15 12 views
1

以下の表に基づいてレコードをエクスポートしたいと思います。SQLクエリ - IDのある3つのテーブルからのクエリ

de_orders(DATE_ADDが作成順序で)

id_order | id_carrier |  date_add 
    5  |  1  | 2017-10-24 09:14:51 
    6  |  2  | 2017-10-25 10:14:51 
    7  |  3  | 2017-10-26 08:14:51 

de_order_history

id_order | id_order_state |  date_add 
    5  |  2   | 2017-10-24 10:14:51 
    5  |  3   | 2017-10-24 11:14:51 
    5  |  4   | 2017-10-24 12:14:51 

de_carrier

id_carrier | name 
     1  | XXX 
     2  | YYY 
     3  | ZZZ 

私はその時点で1つの日付しか得ることができません。以下のクエリでは

id_order | id_carrier | date_add(from orders) | date_add (from id_order_state (4)) 
    5  |  XXX  | 2017-10-24 09:14:51 |  2017-10-24 12:14:51 

SELECT 
o.id_order AS ID, 
o.date_add AS Order_date, 
h.date_add AS Delivered_date, 
c.name AS carrier_name 
FROM de_orders o 
LEFT JOIN de_order_history h ON (o.id_order=h.id_order) 
LEFT JOIN de_carrier c ON (o.id_carrier=c.id_carrier) 
WHERE YEAR(o.date_add) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(o.date_add) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
AND h.id_order_state="4" 
GROUP BY o.id_order 
ORDER BY o.id_order 

私は次のことをエクスポートしたいと思います:

望ましい結果が

id_order | id_carrier | date_add(from orders) | date_add (from id_order_state (3)) | date_add (from id_order_state (4)) 
    5  |  XXX  | 2017-10-24 09:14:51 |  2017-10-24 11:14:51   |  2017-10-24 12:14:51 
(id_order_state = 4すべてのレコードを返します)

私は間違った方法でそれを見ていますか?

ありがとうございます。

+0

*望ましい結果は*(4 id_order_state =すべてのレコードを返します)。.. id_order = 5。計算された列* date_add(id_order_state(3)から)はどのような基準に一致しますか? – Parfait

+0

はい、私は、希望通りにリターンを達成するために条件を設定することに迷っています。 – Enthu

答えて

1

id_order_stateWHERE条件をインラインCASEステートメントに移動して条件付集計を検討してください。また、あなたのGROUP BYは現在、非凝集列がGROUP BYに含まれていなければならないSQL ANSIと構文上正しいことがORDER_DATEが含まれています:句:

SELECT o.id_order AS ID, 
     c.`name` AS ID_Carrier, 
     o.date_add AS Order_date, 
     MAX(CASE 
       WHEN h.id_order_state='3' 
       THEN h.date_add 
      END) AS ID_Order_State_3_Deliver_date, 
     MAX(CASE 
       WHEN h.id_order_state='4' 
       THEN h.date_add 
      END) AS ID_Order_State_4_Deliver_date, 
     c.name AS carrier_name 
FROM de_orders o 
LEFT JOIN de_order_history h ON (o.id_order=h.id_order) 
LEFT JOIN de_carrier c ON (o.id_carrier=c.id_carrier) 
WHERE YEAR(o.date_add) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) 
    AND MONTH(o.date_add) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)  
GROUP BY o.id_order, c.`name`, o.date_add 
ORDER BY o.id_order, c.`name`, o.date_add 
+0

私はMAX(CASE .... END)ASに置くことができる状態に留意します...私は以前にインラインのcase文を使ったことはありません。あなたのアドバイスとサンプルコードをありがとう、私の問題を解決するのを助けてくれました。 – Enthu

+0

素晴らしい!お役に立てて嬉しいです。はい 'CASE'は集約でラップすることができ、条件付きの列の割り当てに役立ちます。 – Parfait

関連する問題