2017-02-14 24 views
1

私はMySQLデータベースからいくつかの統計を取得する必要があります。注文サイズの範囲で注文量を取得する必要があります。その後、WEEK、テーブルcreated_at in orders価格帯での注文数と週番号によるグループ

これは意味があると思います。

ここで私が思いついたことはありますが、高度なMySQLでの経験はほとんどありません。細かい範囲と注文を出力

SELECT 
    x.Kurv, COALESCE(ordre, 0) AS ordre 
FROM (
    SELECT "0 - 100" AS Kurv 
    UNION SELECT "100 - 200" 
    UNION SELECT "200 - 300" 
    UNION SELECT "300 - 400" 
    UNION SELECT "400 - 500" 
    UNION SELECT "500 - 600" 
    UNION SELECT "over 600") x 
LEFT JOIN 
    (SELECT 
    CASE when base_total_ex_tax >= 0 and base_total_ex_tax <= 100 then "0 - 100" 
     when base_total_ex_tax > 100 and base_total_ex_tax <= 200 then "100 - 200" 
     when base_total_ex_tax > 200 and base_total_ex_tax <= 300 then "200 - 300" 
     when base_total_ex_tax > 300 and base_total_ex_tax <= 400 then "300 - 400" 
     when base_total_ex_tax > 400 and base_total_ex_tax <= 500 then "400 - 500" 
     when base_total_ex_tax > 500 and base_total_ex_tax <= 600 then "500 - 600" 
     else "over 600" 
    END AS Kurv, 
    COUNT(*) as ordre 
FROM orders 
WHERE 
    created_at > '2017-01-01 00:00:00' 
    && 
    status_id != 'canceled' 
GROUP BY 1) 
    y ON x.Kurv = y.Kurv 

、私はちょうど一週間グループを追加する必要があります。

ありがとうございます。

答えて

1

下に確認してください。

SELECT CONCAT(YEAR(date), '/', WEEK(date)) as wk 
,  CASE 
     WHEN amount <= 100 THEN '0 - 100' 
     WHEN amount <= 200 THEN '100 - 200' 
     ELSE '> 200' 
     END as kurve 
,  COUNT(*) 
FROM orderstable 
GROUP BY 
     wk 
,  kurve 

Example at rextester.

あなたはすべてのkurvesと週を一覧表示したい場合は(あなたがすでにやったように)しても、それらの注文せずに、あなたはすべてのkurvesを追加することができますし、all weeks:次に、あなたはそれにグループ化することができ左側の結合の右側に移動します。クライアント側で行う方が簡単です。

+0

それは魅力的に機能しました! :-) どうも。 – RK4002

0

私はあなたの問題を正しく理解していました。

あなたはCONCAT(YEAR(date), '/', WEEK(date))で週見つけることができますクエリ

 SELECT 
    Y.WEEK_VAL , x.Kurv, COALESCE(ordre, 0) AS ordre 
FROM (
    SELECT "0 - 100" AS Kurv 
    UNION SELECT "100 - 200" 
    UNION SELECT "200 - 300" 
    UNION SELECT "300 - 400" 
    UNION SELECT "400 - 500" 
    UNION SELECT "500 - 600" 
    UNION SELECT "over 600") x 
LEFT JOIN 
    (SELECT WEEK(created_at) WEEK_VAL, 
    CASE when 5 >= 0 and 5 <= 100 then "0 - 100" 
     when 5 > 100 and 5 <= 200 then "100 - 200" 
     when 5 > 200 and 5 <= 300 then "200 - 300" 
     when 5 > 300 and 5 <= 400 then "300 - 400" 
     when 5 > 400 and 5 <= 500 then "400 - 500" 
     when 5 > 500 and 5 <= 600 then "500 - 600" 
     else "over 600" 
    END AS Kurv, 
    COUNT(*) as ordre 
FROM orders GROUP BY WEEK(created_at) , CASE when 5 >= 0 and 5 <= 100 then "0 - 100" 
     when 5 > 100 and 5 <= 200 then "100 - 200" 
     when 5 > 200 and 5 <= 300 then "200 - 300" 
     when 5 > 300 and 5 <= 400 then "300 - 400" 
     when 5 > 400 and 5 <= 500 then "400 - 500" 
     when 5 > 500 and 5 <= 600 then "500 - 600" 
     else "over 600" 
    END) 
    y ON x.Kurv = y.Kurv 
+0

私はあなたがしたと思うが、エラーが出る: フィールドリストのSQLエラー(1054)不明な列 'Y.WEEK_VAL'。 非常に速い返信をありがとう! :-) – RK4002

+0

内部クエリ "Y"だけを実行できますか?ご確認ください。 – Tajinder

+0

私はそれを働かせることはできませんが、それは十分かもしれない、十分にexperincedされていないかもしれません。 :-O – RK4002

関連する問題