2017-09-21 2 views
1

pouvez-vous m'aider à sélectionner et à additionner toutes les valeurs de la table, et à les afficher en fonction des mois/de cette année?Sélectionner et afficher selon l'année/mois

Table regarde comme suit »

| ID | value | reg_date   | 
| 1 | 2  | 2017-01-11 02:26:22 | 
| 2 | 2  | 2017-03-12 12:22:23 | 
| 3 | 2  | 2017-04-13 08:26:33 | 
| 4 | 3  | 2017-04-15 12:26:16 | 
| 5 | 5  | 2017-05-15 19:26:13 | 
| 6 | 2  | 2017-06-14 17:12:16 | 
| 7 | 6  | 2017-07-12 14:26:16 | 
| 8 | 1  | 2015-09-11 13:23:16 | 
| 9 | 1  | 2016-09-05 12:26:34 | 
| 10 | 1  | 2017-12-11 19:11:45 | 

Et je voudrais obtenir quelque chose comme:

| value | reg_date     | 
| 2 | 2017-01     | 
| 0 | 2017-02     | 
| 2 | 2017-03     | 
| 5 | 2017-04     | 
| 5 | 2017-05     | 
| 2 | 2017-06     | 
| 6 | 2017-07     | 
| 0 | 2017-08     | 
| 2 | 2017-09     | 
| 0 | 2017-10     | 
| 0 | 2017-11     | 
| 1 | 2017-12     | 
+0

Envisager de traiter les problèmes d'affichage des données (par exemple, les résultats «manquants») dans le code de l'application. – Strawberry

Répondre

0

Vous pouvez formater la façon dont la date est affichée et le groupe par ce résultat

SELECT count (ID), DATE_FORMAT (reg_date, "% Y-% m") AS rd FROM nom de table GROUP BY rd

+0

oui je sais cela mais je voudrais montrer aussi un mois vide qui n'existe pas dans la base de données comme 0 –

3

I approche ied de suite pour résoudre votre problème:

--created sample table datte which will contain following records 

create table datte (id int identity(1,1), value int, reg_date datetime); 

insert into datte(value,reg_date) values (2,'2017-01-11 02:26:22'); 
insert into datte(value,reg_date) values (2,'2017-03-12 12:22:23'); 
insert into datte(value,reg_date) values (2,'2017-04-13 08:26:33'); 
insert into datte(value,reg_date) values (3,'2017-04-15 12:26:16'); 
insert into datte(value,reg_date) values (5,'2017-05-15 19:26:13'); 
insert into datte(value,reg_date) values (2,'2017-06-14 17:12:16'); 
insert into datte(value,reg_date) values (6,'2017-07-12 14:26:16'); 
insert into datte(value,reg_date) values (1,'2015-09-11 13:23:16'); 
insert into datte(value,reg_date) values (1,'2016-09-05 12:26:34'); 
insert into datte(value,reg_date) values (1,'2017-12-11 19:11:45'); 

alors je créé un type de table pour stocker la liste de l'année

create type [values] as table(
[year] int 
); 

Vous pouvez également utiliser la table temporaire ici.

-- create temp table to store the output 
create table #tempdate([year] varchar(1000), [count] int); 

--create a variable of table type values 
declare @years as [values] , 
--create following variable to process the data 


    @year int, @minyear int,@maxyear int; 

    --insert years in table type variable @years 
    insert into @years 
select YEAR(reg_date) from datte 
group by YEAR(reg_date) 

--store min year and max year value in variable for processing 
select @minyear = min([year]) from @years; 
select @maxyear = max([year]) from @years; 

-- logic to create query to get desired output 
while(@minyear <= @maxyear) 
begin 
SET @YEAR = @minyear; 

IF EXISTS(SELECT 1 FROM DATTE WHERE REG_DATE LIKE '%'+CONVERT(VARCHAR,@YEAR)+'%') 
BEGIN 

    --insert the yearly in temp table 
    insert into #tempdate 
    select cast(convert(varchar,@year) as varchar) + '-' +cast(m.number as varchar) , isnull(total_qty,0) as total_qty 
    from (
    select number 
    from master.dbo.spt_values 
    where type = 'P' and number between 01 and 12 
    ) m 
    left join (
     select MONTH(reg_date) as mth, SUM(value) as total_qty 
     from  datte 
     where YEAR(reg_date) = @year 
     group by MONTH(reg_date) 
    ) s on m.number = s.mth ; 

    END 

SET @MINYEAR = @MINYEAR + 1; 
end 
--print the data 
select [count],[year] from #tempdate 

espérons que cette aide, Jai

+1

pouvons-nous le faire sans aucun type de table? –

+1

Oui, pourquoi pas. Vous pouvez utiliser la table temporaire. utilisez la requête suivante: create table #tempyear ([year] int). maintenant, plutôt que de stocker les données dans le type de table, vous pouvez utiliser la table temporaire. – Jai

0

fonctionne aussi quelque chose comme:

SELECT start_date, 
IFNULL(TIME_FORMAT(SEC_TO_TIME (sum(value)),'%l.%i'),0) 
as time01 FROM table WHERE YEAR(start_date) = YEAR(CURDATE()) 
and MONTH(start_date) = 01 

SELECT start_date, 
IFNULL(TIME_FORMAT(SEC_TO_TIME (sum(value)),'%l.%i'),0) 
as time02 FROM table WHERE YEAR(start_date) = YEAR(CURDATE()) 
and MONTH(start_date) = 02 
.... 

Merci les gars beaucoup.