Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana Anda bisa menunjukkan nol berturut-turut menggunakan dinamis tahun dan bulan dalam suatu interval?

Teka-teki yang bagus :)

Anda dapat membuat tabel yang akan menampung Tahun dan Bulan yang dibutuhkan untuk interval 12 bulan dan kemudian, lakukan gabungan luar di atasnya :

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

Akan memberikan :

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

Jadi coba ini (contoh dengan 2014 sebagai tahun dan 1 sebagai bulan) :

SQL Fiddle

Pengaturan Skema 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')         
;

**Permintaan **:

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

Hasil :

| 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 |

DIEDIT :

Anda juga dapat membuat tabel alih-alih membuatnya dalam subkueri setiap saat :

SQL Fiddle

Pengaturan Skema 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)
;

Kueri :

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

Hasil :

| 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. Magento Dapatkan SUM total pesanan antara tanggal yang ditentukan

  2. php data mysql acak

  3. cara memilih 5 nilai maks teratas di mytable

  4. Cara membuat cadangan database MySQL menggunakan AutoMySQLBackup

  5. Fungsi MySQL ASIN() – Mengembalikan Arc Sinus dari Angka