2016-11-27 6 views
1

Мне нужна помощь в выполнении этого SQL. Я пробовал некоторые из предложений, но не получил его на 100%, и мои итоги не в порядке.Накопительные итоговые суммы MySQL за каждый день месяца

В запросе указано количество камней и количество карат, производимых каждый день, сначала для камней более 5 карат, затем для камней под 5 карат, поэтому после первой колонки, которая является датой, появляются эти 4 столбца.

Затем следующие две колонки просто добавляют камни вместе и карат вместе для ежедневных итогов.

После этого я хотел бы добавить две колонки, которые создают текущие итоги камней и карат.

Любая помощь будет оценена по достоинству. Спасибо!

select 
    `dbo_List_Dates`.`Full_Date` AS `Full_Date`, 
    if(isnull(`qry_Register_Over5ct`.`StonesO5`), 
    0,`qry_Register_Over5ct`.`StonesO5`) AS `StonesO5`, 
    if(isnull(`qry_Register_Over5ct`.`CaratsO5`), 
    0,format(`qry_Register_Over5ct`.`CaratsO5`,3)) AS `CaratsO5`, 
    if(isnull(`qry_Register_Under5ct`.`StonesU5`), 
    0,`qry_Register_Under5ct`.`StonesU5`) AS `StonesU5`, 
    if(isnull(`qry_Register_Under5ct`.`CaratsU5`), 
    0,format(`qry_Register_Under5ct`.`CaratsU5`,3)) AS `CaratsU5`, 

    (if(isnull(`qry_Register_Over5ct`.`StonesO5`), 
    0,`qry_Register_Over5ct`.`StonesO5`) + if(isnull(`qry_Register_Under5ct`.`StonesU5`), 
    0,`qry_Register_Under5ct`.`StonesU5`)) AS `Stones`, 

    format((if(isnull(`qry_Register_Over5ct`.`CaratsO5`), 
    0,`qry_Register_Over5ct`.`CaratsO5`) + if(isnull(`qry_Register_Under5ct`.`CaratsU5`), 
    0,`qry_Register_Under5ct`.`CaratsU5`)),3) AS `Carats`, 

    date_format(`dbo_List_Dates`.`Full_Date`,'%Y-%m') AS `Date_Filter` 

from 
    (
    (`dbo_List_Dates` 
    left join `qry_Register_Over5ct` 
    on((`dbo_List_Dates`.`Full_Date`=qry_Register_Over5ct`.`Shift_Date`)) 
    ) 
    left join `qry_Register_Under5ct` 
    on((`dbo_List_Dates`.`Full_Date`=`qry_Register_Under5ct`.`Shift_Date`)) 
) 
where 
    (date_format(`dbo_List_Dates`.`Full_Date`,'%Y-%m') = date_format(now(),'%Y-%m')) 
order by 
    `dbo_List_Dates`.`Full_Date` 
limit 0,31 
+0

см [Что такое Sqlfiddle и почему я должен заботиться?] (Http://stackoverflow.com/q/38899464) – Drew

+0

Почему тег MySQL? – Strawberry

+0

Представлены ли 'qry_Register_Over5ct' и' qry_Register_Under5ct'? Я бы предположил, что это уже неэффективно, потому что вы просматриваете одни и те же таблицы дважды, чтобы определить размер камня. –

ответ

0

Выполнение итогов в mysql требует использования переменных. Для примера, приведенного

create table register (id int, dt date, carats int); 
insert into register values 
(1,'2016-11-01',10),(2,'2016-11-01',10),(3,'2016-11-01',1), 
(4,'2016-11-02',1), 
(5,'2016-11-03',10), 
(6,'2016-11-05',10),(7,'2016-11-05',1); 

и таблица даты, как это

+------------+ 
| dte  | 
+------------+ 
| 2016-11-01 | 
| 2016-11-02 | 
| 2016-11-03 | 
| 2016-11-04 | 
| 2016-11-05 | 
+------------+ 

select s.* ,@RunningTotal:[email protected] + s.LT5_GE5 RunningTotal 
from 
(
select d.dte, 
     sum(case when r.dt is not null and r.carats >= 5 then 1 else 0 end) GE5, 
     sum(case when r.dt is not null and r.carats < 5 then 1 else 0 end) LT5, 
     sum(case when r.dt is not null and r.carats >= 5 then 1 else 0 end) + 
     sum(case when r.dt is not null and r.carats < 5 then 1 else 0 end) LT5_GE5 
from dates d 
left join register r on r.dt = d.dte 
where dte between '2016-11-01' and '2016-11-05' 
group by dte 
) s ,(select @RunningTotal:=0) rt 

Результаты

+------------+------+------+---------+--------------+ 
| dte  | GE5 | LT5 | LT5_GE5 | RunningTotal | 
+------------+------+------+---------+--------------+ 
| 2016-11-01 | 2 | 1 |  3 |   3 | 
| 2016-11-02 | 0 | 1 |  1 |   4 | 
| 2016-11-03 | 1 | 0 |  1 |   5 | 
| 2016-11-04 | 0 | 0 |  0 |   5 | 
| 2016-11-05 | 1 | 1 |  2 |   7 | 
+------------+------+------+---------+--------------+ 

И если вы хотите столбец итоговыми может включать накопительный пакет в группе

select s.* , 
      cast(if(dte is null,@RunningTotal,@RunningTotal:[email protected]ngTotal + s.LT5_GE5) as int) RunningTotal 
from 
(
select d.dte, 
     sum(case when r.dt is not null and r.carats >= 5 then 1 else 0 end) GE5, 
     sum(case when r.dt is not null and r.carats < 5 then 1 else 0 end) LT5, 
     sum(case when r.dt is not null and r.carats >= 5 then 1 else 0 end) + 
     sum(case when r.dt is not null and r.carats < 5 then 1 else 0 end) LT5_GE5 
from dates d 
left join register r on r.dt = d.dte 
where dte between '2016-11-01' and '2016-11-05' 
group by dte with rollup 
) s ,(select @RunningTotal:=0) rt 

Результат

+------------+------+------+---------+--------------+ 
| dte  | GE5 | LT5 | LT5_GE5 | RunningTotal | 
+------------+------+------+---------+--------------+ 
| 2016-11-01 | 2 | 1 |  3 |   3 | 
| 2016-11-02 | 0 | 1 |  1 |   4 | 
| 2016-11-03 | 1 | 0 |  1 |   5 | 
| 2016-11-04 | 0 | 0 |  0 |   5 | 
| 2016-11-05 | 1 | 1 |  2 |   7 | 
| NULL  | 4 | 3 |  7 |   7 | 
+------------+------+------+---------+--------------+ 
6 rows in set (0.02 sec) 
Смежные вопросы