sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan du vise nul i en række ved at bruge år og måneds dynamik i et interval?

Dejligt puslespil :)

Du kan generere en tabel, der vil indeholde år og måned, der er nødvendig i 12 måneders intervallet, og derefter lave en ydre joinforbindelse på den:

SET @var_year ='2013'SET @var_month ='12'SELECT @row :=@row + (case when right(@row,2) ="12" derefter 89 else 1 end) som YearMonth FRA (vælg 0 fagforeninger alle vælg 1 fagforeninger alle vælg 3 fagforeninger alle vælg 4 fagforeninger alle vælg 5 fagforeninger alle vælg 6 fagforeninger alle vælg 6 fagforeninger alle vælg 7 fagforeninger alle vælg 8 fagforeninger alle vælg 9 fagforeninger alle vælg 10 fagforeninger alle vælg 11) t ,(SELECT @row:=CONCAT(@var_year,right(concat('0',(@var_month-1)),2))) r 

Vil give :

| År Måned ||-----------|| 201312 || 201401 || 201402 || 201403 || 201404 || 201405 || 201406 || 201407 || 201408 || 201409 || 201410 || 201411 |

Så prøv dette (eksempel med 2014 som år og 1 som måned) :

SQL Fiddle

MySQL 5.5 Schema Setup :

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

**Forespørgsel **:

SET @var_year ='2014'SET @var_month ='1'VÆLG count(created_at) AS count_all, left(YearMonth,4) as actual_year, right(YearMonth,2) as actual_month FROM (SELECT @row :=@række + (tilfælde når højre(@række,2) ="12" derefter 89 ellers 1 ende) som ÅrMåned FRA (vælg 0 forening alle vælg 1 forening alle vælg 3 forening alle vælg 4 forening alle vælg 5 forening alle vælg 6 union alle vælg 6 union alle vælg 7 union alle vælg 8 union alle vælg 9 union alle vælg 10 union alle vælg 11) t,(SELECT @row:=CONCAT(@var_year,right(concat('0',(@var_month -1)),2))) r) som YearMonthTableLEFT YDRE JOIN skabelser PÅ CONCAT(year(created_at),right(concat('0',month(created_at)),2)) =YearMonthGROUP BY YearMonthORDER BY YearMonth ASC 

Resultater :

| tæl_alle | faktisk_år | faktisk_måned ||-----------|----------------|--------------------|| 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 |

REDIGERET:

Du kan også oprette tabellen i stedet for at generere den i en underforespørgsel hver gang :

SQL Fiddle

MySQL 5.5 Schema Setup :

CREATE TABLE YearMonthTable(`tblYear` int, `tblMonth` int);INSERT INTO YearMonthTable (`tblYear`,`tblMonth`)VÆRDIER (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); 

Forespørgsel :

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 YearMonthTableLEFT OUTER JOIN creations ) =tblÅR OG måned(created_at) =tblMonthWHERE STR_TO_DATE(CONCAT(tblÅr, '/', tblMonth, '/01'), '%Y/%m/%d') MELLEM @from OG @til GRUPPER EFTER tblMåned, tblY BY tblYear, tblMonth 

Resultater :

| tæl_alle | tblÅr | tblMåned ||------------|--------|----------|| 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. Fremskynder GROUP BY-, SUM- og AVG-forespørgsler

  2. Aktiver Entity Framework 6 for MySql (C#) i WinForms af Microsoft Visual Studio 2013

  3. Kan jeg lave en mysql Select, Update og Delete i én forespørgsel?

  4. TRIGGER eller MULTI Insert