Home > Back-end >  Get price by month in mysql
Get price by month in mysql

Time:09-26

I need to get the total price per month.

I have

  • inited_time (ex. 20160530105130)
  • first_payment_price
  • deleted

I tried grouping by inited_time

SELECT inited_time, DATE_FORMAT(inited_time, '%c') as month, SUM(first_payment_price) as price
FROM some_table
WHERE inited_time > 0 AND deleted = 0
GROUP BY inited_time

But it doesn't sum them together. ex of result:

[
  {
    "inited_time": 20160530105130,
    "month": "5",
    "price": 25000.00
  },
  {
    "inited_time": 20160530105157,
    "month": "5",
    "price": 100000.00
  },
  {
    "inited_time": 20160610000002,
    "month": "6",
    "price": 75000.00
  },
  {
    "inited_time": 20160617000001,
    "month": "6",
    "price": 50000.00
  },
  {
    "inited_time": 20160701000001,
    "month": "7",
    "price": 80000.00
  },
  {
    "inited_time": 20160702000001,
    "month": "7",
    "price": 200000.00
  }
]

CodePudding user response:

Ideally the inited_time column would be a format date or timestamp. Assuming it is fixed width, we can aggregate by month using division and modulus on this column to isolate the month number:

SELECT FLOOR(inited_time / 100000000) % 100 AS month, SUM(first_payment_price) AS price
FROM some_table
WHERE inited_time > 0 AND deleted = 0
GROUP BY 1;

Assuming you might have multiple years in your data set and you would want to report each year month separately, we can try using STR_TO_DATE followed by DATE_FORMAT:

SELECT DATE_FORMAT(STR_TO_DATE(inited_time, '%Y%m%d%H%i%s'), '%Y-%m') AS ym,
       SUM(first_payment_price) AS price
FROM some_table
WHERE inited_time > 0 AND deleted = 0
GROUP BY 1
ORDER BY 1;

CodePudding user response:

group by month

SELECT  DATE_FORMAT(inited_time, '%c') as month, SUM(first_payment_price) as price
    FROM some_table
    WHERE inited_time > 0 AND deleted = 0
    GROUP BY month

CodePudding user response:

I need to get the total price per month.

Simply, group by month and remove inited_time from the select clause

SELECT  DATE_FORMAT(inited_time, '%c') as month, 
        SUM(first_payment_price) as price
FROM   some_table
WHERE inited_time > 0 
AND deleted = 0
GROUP BY DATE_FORMAT(inited_time, '%c');

Edit. If you have different years included add another condition DATE_FORMAT(20160530105130, '%Y'), or if you want only one year even though you have different years filter the needed year on the where clause. For example for 2016 year the condition would be DATE_FORMAT(inited_time, '%Y') = 2016

SELECT  DATE_FORMAT(inited_time, '%c') as month,
        DATE_FORMAT(inited_time, '%Y') as year,
        SUM(first_payment_price) as price
FROM   some_table
WHERE inited_time > 0 
AND deleted = 0
GROUP BY DATE_FORMAT(inited_time, '%c'),DATE_FORMAT(inited_time, '%Y');
  • Related