2013-04-26 4 views
1

Предположим, что у нас есть таблица (например, sales) с тремя полями id (int, primary), price (double), date (datetime).Как узнать сумму каждого месяца в MySQL?

Как мы можем получить сумму атрибута price для каждого дня текущего месяца?

И до последнего месяца?

мне нужно вернуться с чем-то подобным тоже:

февраля

01  02  03  04  ...  30 
101.1  233.43 1232.42 3232.21    121.23 

апреля

01  02  03  04  ...  30  31 
11.1  23.43  122.42 332.21    121.23 2323.32 

Как мы можем выполнить это?

Пожалуйста, дайте мне пример SQL.

Я думаю написать метод, чтобы узнать количество дней месяца, а затем создать SQL итеративно, но я думаю, что это не лучший способ.

+2

'select sum (price) ... group by year (datefield), month (datefield), day (datefield)' –

+1

Вы хотите, чтобы результат был горизонтальным? – Kermit

+0

@FreshPrinceOfSO, быть горизонтальным на самом деле не нужно, thx для уведомления. – GarouDan

ответ

0

Сбор всех идей (ТНХ @MarcB, @Stephan, @GordonLinoff) SQL сильфоны, что я ищу:

февраля

SELECT 
    SUM(price) AS daySum 
FROM 
    sales 
WHERE 
    date BETWEEN DATE_FORMAT(NOW() - INTERVAL 2 MONTH,'%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(NOW() - INTERVAL 2 MONTH),'%Y-%m-%d 23:59:59') 
GROUP BY 
    YEAR(date), 
    MONTH(date), 
    DAY(date) 

Апрель (в настоящее время мы находимся в апреле месяце)

SELECT 
    SUM(price) AS daySum 
FROM 
    sales 
WHERE 
    date BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01 00:00:00') AND DATE_FORMAT(LAST_DAY(NOW()),'%Y-%m-%d 23:59:59') 
GROUP BY 
    YEAR(date), 
    MONTH(date), 
    DAY(date) 

Thx много.

+1

Большое спасибо! Знаете ли вы, как вы можете сделать это даже для дат, когда нет порядка, он показывает 0. Сейчас он просто избавится от этого дня в результате и даст непоследовательные результаты (некоторые дни будут отсутствовать) –

2

Вы на самом деле хотите, чтобы сделать стержень:

select year(date), month(date), 
     sum(case when day(date) = 1 then price end) as price_01, 
     sum(case when day(date) = 2 then price end) as price_02, 
     . . . 
     sum(case when day(date) = 31 then price end) as price_31 
from sales 
group by month(date), year(date) 

Затем добавить пункт where для дат, которые вы хотите. Что-то вроде:

where month(date) = month(now()) 
Смежные вопросы