2017-10-09 14 views
0

Bonjour à tous Ce que j'essaie de faire une sortie de séquence, j'ai besoin d'une valeur à ajouter chaque mois qui sera prise de ma base de données, donc ce que je veux, c'est la valeur ajouté à partir de toutes les données d'entrée pour le même mois, puis l'ajouter à une valeur (a), puis le mois suivant (b) + cette valeur (a) dire le dernier mois, je sais que ça sonne confus mais je vais essayer de répondre à toute question d'expliquer plus j'espère que je peux obtenir une aide ... je vais écrire ce que je pensais à faire dans la procédure stockée:Création d'une séquence Somme à partir de la base de données

SELECT * FROM mysqldatabase.usecases 
A = Sum Work Where SingOffDate <='2017-01-30' and SingOffDate >= '2017-01-01' , B = Sum Work sum A Where SingOffDate <='2017-02-30' and SingOffDate >= '2017-02-01', 
C = Sum Work sum B Where SingOffDate <='2017-03-30' and SingOffDate >= '2017-03-01', D = Sum Work sum C Where SingOffDate <='2017-04-30' and SingOffDate >= '2017-04-01'; 

donc je veux calculer la séquence de travail Evey mois Disons les données de l'apparence de la table d'efficacité comme:

Work | SingOffDate 
    2 | 11/01/2017 
    0.12 | 12/01/2017 
    0.3 | 5/01/2017 
    0.48 | 11/02/2017 
    1 | 15/02/2017 
    0.86 | 09/03/207 

Et Le Reselt je veux ressembler à:

A = somme jan b = a feb somme, c = somme b peut ======> A = 2,42 , b = 3,9, c = 4,76

+0

Cela ressemble à une simple somme d'un groupe par rapport à l'année et mois. Il serait utile de clarifier si vous pouvez ajouter des exemples de données et le résultat attendu à votre question - sous forme de texte ou dans sqlfiddle. –

+0

@ P.Salmon je vais ajouter un échantillon des données et le résultat –

Répondre

0

Je ne suis toujours pas clair sur votre résultat attendu, mais cela peut faire

drop table if exists t; 
create table t(Work decimal(10,2) ,SingOffDate date); 
insert into t values 
( 2 , str_to_date('11/01/2017','%d/%m/%Y')), 
( 0.12 , str_to_date('12/01/2017','%d/%m/%Y')), 
( 0.3 , str_to_date('5/01/2017','%d/%m/%Y')), 
( 0.48 , str_to_date('11/02/2017','%d/%m/%Y')), 
( 1 , str_to_date('15/02/2017','%d/%m/%Y')), 
( 0.86 , str_to_date('09/03/2017','%d/%m/%Y')); 

select max(case when yyyymm = '2017/1' then RunningTotal else 0 end) as a, 
     max(case when yyyymm = '2017/2' then RunningTotal else 0 end) as b, 
     max(case when yyyymm = '2017/3' then RunningTotal else 0 end) as c 
from 
(
select yyyymm,work,@rt:[email protected] + work as RunningTotal 
from 
(
select concat(year(singoffdate),'/',month(singoffdate)) yyyymm, 
      sum(work) as work 
from t 
group by concat(year(singoffdate),'/',month(singoffdate)) 
) t, (select @rt:=0) r 
) u 
; 

Où dans le plus profond Qué Je résume le travail par mois et par année, en dehors de cela, je calcule un total cumulé et finalement j'utilise l'agrégation conditionnelle pour faire pivoter le résultat qui ressemble à ceci.

+------+------+------+ 
| a | b | c | 
+------+------+------+ 
| 2.42 | 3.9 | 4.76 | 
+------+------+------+ 
1 row in set (0.00 sec) 

Ou peut-être vous voulez juste le total en cours d'exécution sous cette forme

+--------+------+--------------+ 
| yyyymm | work | RunningTotal | 
+--------+------+--------------+ 
| 2017/1 | 2.42 |   2.42 | 
| 2017/2 | 1.48 |   3.9 | 
| 2017/3 | 0.86 |   4.76 | 
+--------+------+--------------+ 
3 rows in set (0.00 sec) 

Dans ce cas, utilisez cette requête

select yyyymm,work,@rt:[email protected] + work as RunningTotal 
from 
(
select concat(year(singoffdate),'/',month(singoffdate)) yyyymm, 
      sum(work) as work 
from t 
group by concat(year(singoffdate),'/',month(singoffdate)) 
) t, (select @rt:=0) r 
+0

thxxx que ce que je veux –