Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wyświetlić zero z rzędu przy użyciu dynamiki roku i miesiąca w przedziale?

Ładna zagadka :)

Możesz wygenerować tabelę, która będzie zawierała Rok i Miesiąc potrzebne na okres 12 miesięcy, a następnie wykonać na niej zewnętrzne złącze :

SET @var_year = '2013'
SET @var_month = '12'

SELECT @row := @row + (case when right(@row,2) = "12" then 89 else 1 end) as YearMonth 
FROM 
(select 0 union all select 1 union all select 3 union all 
 select 4 union all select 5 union all select 6 union all 
 select 6 union all select 7 union all select 8 union all 
 select 9 union all select 10 union all select 11) t,
(SELECT @row:=CONCAT(@var_year,right(concat('0',(@var_month-1)),2))) r

Da :

| YearMonth |
|-----------|
|    201312 |
|    201401 |
|    201402 |
|    201403 |
|    201404 |
|    201405 |
|    201406 |
|    201407 |
|    201408 |
|    201409 |
|    201410 |
|    201411 |

Spróbuj więc tego (przykład z 2014 jako rokiem i 1 jako miesiącem):

Skrzypce SQL

Konfiguracja schematu MySQL 5.5 :

CREATE TABLE creations(`id` int, `created_at` date )
;

INSERT INTO creations
    (`id`, `created_at`)
VALUES
    (1, '2013-12-11'),
    (2, '2014-01-11'),
    (3, '2014-01-21'),
    (4, '2014-01-12'),
    (5, '2014-02-22'),    
    (6, '2014-02-13'),
    (7, '2014-03-12'),    
    (8, '2014-04-23'),
    (9, '2014-05-23'),
    (10,'2014-06-23'),
    (11,'2014-08-23'),    
    (12,'2014-08-23'),
    (13,'2014-09-23'),
    (14,'2014-10-23'),    
    (15,'2014-11-23'),        
    (16,'2014-12-23')         
;

**Zapytanie**:

SET @var_year = '2014'
SET @var_month = '1'

SELECT count(created_at) AS count_all,
       left(YearMonth,4) as actual_year,
       right(YearMonth,2) as actual_month 
FROM (
SELECT @row := @row + (case when right(@row,2) = "12" then 89 else 1 end) as YearMonth FROM 
(select 0 union all select 1 union all select 3 union all 
 select 4 union all select 5 union all select 6 union all 
 select 6 union all select 7 union all select 8 union all 
 select 9 union all select 10 union all select 11) t,
(SELECT @row:=CONCAT(@var_year,right(concat('0',(@var_month-1)),2))) r
) as YearMonthTable
LEFT OUTER JOIN creations ON
  CONCAT(year(created_at),right(concat('0',month(created_at)),2)) = YearMonth
GROUP BY YearMonth
ORDER BY YearMonth ASC

Wyniki :

| count_all | actual_year | actual_month |
|-----------|-------------|--------------|
|         3 |        2014 |           01 |
|         2 |        2014 |           02 |
|         1 |        2014 |           03 |
|         1 |        2014 |           04 |
|         1 |        2014 |           05 |
|         1 |        2014 |           06 |
|         0 |        2014 |           07 |
|         2 |        2014 |           08 |
|         1 |        2014 |           09 |
|         1 |        2014 |           10 |
|         1 |        2014 |           11 |
|         1 |        2014 |           12 |

EDYTOWANO:

Możesz również utworzyć tabelę zamiast generować ją za każdym razem w podzapytaniu :

Skrzypce SQL

Konfiguracja schematu MySQL 5.5 :

CREATE TABLE YearMonthTable(`tblYear` int, `tblMonth` int)
;

INSERT INTO YearMonthTable
    (`tblYear`,`tblMonth`)
VALUES
    (2013,12),
    (2014,1),
    (2014,2),    
    (2014,3),    
    (2014,4),
    (2014,5),
    (2014,6),
    (2014,7),    
    (2014,8),
    (2014,9),
    (2014,10),    
    (2014,11),        
    (2014,12),
    (2015,1),
    (2015,2),    
    (2015,3),    
    (2015,4),
    (2015,5)
;

Zapytanie :

SET @var_year = '2014'
SET @var_month = '1'

SET @from = STR_TO_DATE(CONCAT(@var_year, '/', @var_month, '/01'), '%Y/%m/%d')
SET @to = DATE_ADD(DATE_ADD(@from, INTERVAL 12 MONTH), INTERVAL -1 DAY)

SELECT count(created_at) AS count_all,
       tblYear as actual_year,
       tblMonth as actual_month 
FROM YearMonthTable
LEFT OUTER JOIN creations ON year(created_at) = tblYear AND 
                             month(created_at) = tblMonth
WHERE STR_TO_DATE(CONCAT(tblYear, '/', tblMonth, '/01'), '%Y/%m/%d') 
                                                    BETWEEN @from AND @to                               
GROUP BY tblMonth, tblYear
ORDER BY tblYear, tblMonth

Wyniki :

| count_all | tblYear | tblMonth |
|-----------|---------|----------|
|         3 |    2014 |        1 |
|         2 |    2014 |        2 |
|         1 |    2014 |        3 |
|         1 |    2014 |        4 |
|         1 |    2014 |        5 |
|         1 |    2014 |        6 |
|         0 |    2014 |        7 |
|         2 |    2014 |        8 |
|         1 |    2014 |        9 |
|         1 |    2014 |       10 |
|         1 |    2014 |       11 |
|         1 |    2014 |       12 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL aktualizuje całą bazę danych bez przestojów

  2. Jak wstawić DECIMAL do bazy danych MySQL

  3. MySQL Group_Concat() a T-SQL String_Agg()

  4. Czy istnieje sposób na wycofanie po zatwierdzeniu w MySQL?

  5. Losowa kolejność z Entity Framework i MySQL