복붙노트

[SQL] 의 판매와 달을 포함하여 지난 12 개월의 MySQL의 월간 판매

SQL

의 판매와 달을 포함하여 지난 12 개월의 MySQL의 월간 판매

SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total
FROM cart
WHERE date <= NOW()
and date >= Date_add(Now(),interval - 12 month)
GROUP BY DATE_FORMAT(date, "%m-%Y")

단지 기존의 달 결과를 표시이 쿼리. 나는 모든 12 개 개월 판매를해야합니다.

산출:

"month" "total"  
--------------  
"Jun"   "22"
"Aug"   "30"
"Oct"   "19"
"Nov"   "123"
"Dec"   "410"

필수 출력 :

"month" "total"  
--------------
"Jan"   "0"
"Feb"   "0"
"Mar"   "0"
"Apr"   "0"
"May"   "0"
"Jun"   "22"
"Jul"   "0"
"Aug"   "30"
"Sep"   "0"
"Oct"   "19"
"Nov"   "123"
"Dec"   "410"

해결법

  1. ==============================

    1.다음 표를 고려

    다음 표를 고려

    mysql> select * from cart ;
    +------+------------+-------------+
    | id   | date       | total_price |
    +------+------------+-------------+
    |    1 | 2014-01-01 |          10 |
    |    2 | 2014-01-20 |          20 |
    |    3 | 2014-02-03 |          30 |
    |    4 | 2014-02-28 |          40 |
    |    5 | 2014-06-01 |          50 |
    |    6 | 2014-06-13 |          24 |
    |    7 | 2014-12-12 |          45 |
    |    8 | 2014-12-18 |          10 |
    +------+------------+-------------+
    

    이제 논리에 따라 당신은 일년 다시 찾고 및 전기 십이 2013 2014년 12월 즉 결과에 두 번 표시되며 우리가 그들에 대해 별도의 계산이 필요하면 우리가 생성 동적 날짜 범위 MySQL을 단일의 다음과 같은 기술을 사용할 수 있습니다로 표는 지난 7 일을 선택하고 빈 행을 포함

    t1.month,
    t1.md,
    coalesce(SUM(t1.amount+t2.amount), 0) AS total
    from
    (
      select DATE_FORMAT(a.Date,"%b") as month,
      DATE_FORMAT(a.Date, "%m-%Y") as md,
      '0' as  amount
      from (
        select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
        from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
        cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
        cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
      ) a
      where a.Date <= NOW() and a.Date >= Date_add(Now(),interval - 12 month)
      group by md
    )t1
    left join
    (
      SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as amount ,DATE_FORMAT(date, "%m-%Y") as md
      FROM cart
      where Date <= NOW() and Date >= Date_add(Now(),interval - 12 month)
      GROUP BY md
    )t2
    on t2.md = t1.md 
    group by t1.md
    order by t1.md
    ;
    

    출력 될 것입니다

    +-------+---------+-------+
    | month | md      | total |
    +-------+---------+-------+
    | Jan   | 01-2014 |    30 |
    | Feb   | 02-2014 |    70 |
    | Mar   | 03-2014 |     0 |
    | Apr   | 04-2014 |     0 |
    | May   | 05-2014 |     0 |
    | Jun   | 06-2014 |    74 |
    | Jul   | 07-2014 |     0 |
    | Aug   | 08-2014 |     0 |
    | Sep   | 09-2014 |     0 |
    | Oct   | 10-2014 |     0 |
    | Nov   | 11-2014 |     0 |
    | Dec   | 12-2013 |     0 |
    | Dec   | 12-2014 |    55 |
    +-------+---------+-------+
    13 rows in set (0.00 sec)
    

    그리고 당신은 위의 경우에 대해 2,013 즉 12월 2014 년 십이 상관하지 않는 경우

    그럼 그냥 동적 날짜 부분에 의해 그룹을 변경

    where a.Date <= NOW() and a.Date >= Date_add(Now(),interval - 12 month)
      group by month
    

    및 t1.month하여 같은 그룹의 최종 그룹

  2. ==============================

    2.@pankaj 힌트 주셔서 감사합니다, 여기에 내가이 쿼리를 통해 해결 ...

    @pankaj 힌트 주셔서 감사합니다, 여기에 내가이 쿼리를 통해 해결 ...

    SELECT 
        SUM(IF(month = 'Jan', total, 0)) AS 'Jan',
        SUM(IF(month = 'Feb', total, 0)) AS 'Feb',
        SUM(IF(month = 'Mar', total, 0)) AS 'Mar',
        SUM(IF(month = 'Apr', total, 0)) AS 'Apr',
        SUM(IF(month = 'May', total, 0)) AS 'May',
        SUM(IF(month = 'Jun', total, 0)) AS 'Jun',
        SUM(IF(month = 'Jul', total, 0)) AS 'Jul',
        SUM(IF(month = 'Aug', total, 0)) AS 'Aug',
        SUM(IF(month = 'Sep', total, 0)) AS 'Sep',
        SUM(IF(month = 'Oct', total, 0)) AS 'Oct',
        SUM(IF(month = 'Nov', total, 0)) AS 'Nov',
        SUM(IF(month = 'Dec', total, 0)) AS 'Dec',
        SUM(total) AS total_yearly
        FROM (
    SELECT DATE_FORMAT(date, "%b") AS month, SUM(total_price) as total
    FROM cart
    WHERE date <= NOW() and date >= Date_add(Now(),interval - 12 month)
    GROUP BY DATE_FORMAT(date, "%m-%Y")) as sub
    
  3. from https://stackoverflow.com/questions/27600863/mysql-monthly-sale-of-last-12-months-including-months-with-no-sale by cc-by-sa and MIT license