1

i have to get some statistics from a MySQL Database, i need to get the amount of orders in ranges of order size, and then i need to group by WEEK, from the table created_at in orders

I hope this makes sense.

Here's what i have been able to come up with, but i have very little experience in advanced 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

Which outputs the ranges and orders fine, i just need to add the week group.

Thanks in advance.

RK4002
  • 97
  • 2
  • 11

2 Answers2

1

You can find the week with CONCAT(YEAR(date), '/', WEEK(date)). Then you can just group on it:

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.

If you want to list all kurves and weeks, even those without orders, you can add all kurves (as you've already done) and all weeks to the right-hand side of a left join. That's typically easier to do client side.

Community
  • 1
  • 1
Andomar
  • 232,371
  • 49
  • 380
  • 404
0

Hoping, i understood your problem correctly.

Please check below query

      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
Tajinder
  • 2,248
  • 4
  • 33
  • 54