MySQL показывает все месяцы между датами

у меня есть запрос

select 
       CONCAT(monthname(a.tanggal), ' ', year(a.tanggal)) as bulan_tahun, 
       sum(a.kg) as kg, 
       sum(a.ka) as ka, 
       sum(a.lr) as lr, 
       sum(a.lh) as lh, 
       sum(a.lb) as lb, 
       sum(a.ll) as ll, 
       sum(a.nc) as nc, 
       sum(a.na) as na, 
       sum(a.sbs) as sbs, 
       sum(a.stbs) as stbs, 
       sum(a.kg)+sum(a.ka)+sum(a.lr)+sum(a.lh)+sum(a.sbs)+sum(a.lb)+sum(a.ll)+sum(a.nc)+sum(a.na)+sum(a.stbs) as total 
   from 
      opr.t_temuan as a 
   where 
          a.id_site=197 
      and a.tanggal between '2010-02-01' and '2011-01-31' 
      and (a.type ='f' or a.type = 'i') 
   group by 
      bulan_tahun 
   order by 
      a.tanggal asc

я получаю месяц возврата

June 2010 0 0 5 0 4 6 0 0 3 3 21
July 2010 0 0 99 39 4 4 0 0 2 2 150
August 2010 0 0 62 79 0 5 5 0 0 0 151
September 2010 0 0 1 0 0 0 0 0 0 0 1
November 2010 0 0 59 4 75 1 0 0 8 8 155
December 2010 0 0 1 0 0 0 0 0 0 0 1

но я хочу вернуть месяц с января 2010 года по декабрь 2010 года, как это

January 2010 0 0 0 0 0 0 0 0 0 0
Febuary 2010 0 0 0 0 0 0 0 0 0 0
Marc 2010 0 0 0 0 0 0 0 0 0 0
April 2010 0 0 0 0 0 0 0 0 0 0
May 2010 0 0 0 0 0 0 0 0 0 0
June 2010 0 0 5 0 4 6 0 0 3 3 21
July 2010 0 0 99 39 4 4 0 0 2 2 150
August 2010 0 0 62 79 0 5 5 0 0 0 151
September 2010 0 0 1 0 0 0 0 0 0 0 1
November 2010 0 0 59 4 75 1 0 0 8 8 155
December 2010 0 0 1 0 0 0 0 0 0 0 1

пожалуйста, помогите мне !! Благодарность


person ojiepermana    schedule 08.03.2011    source источник
comment
если у вас нет данных за эти месяцы в вашей базе данных, то они не войдут в ваш вывод   -  person Lenin Raj Rajasekaran    schedule 08.03.2011


Ответы (1)


В первом запросе используются переменные, объединенные с ЛЮБОЙ таблицей и ограниченные 12 месяцами, поэтому он будет автоматически генерироваться каждый месяц/год, который вы хотите... например: начиная с 2010-01-01 и продолжая 12 месяцев. Второй запрос почти идентичен вашему исходному, предварительно сгруппированный по месяцам, в которых есть актуальные данные. Затем, объединив их слева, каждый месяц в первом будет захватывать то, что он может найти в окончательных агрегациях данных, но сохранять результаты на основе даты, а не в алфавитном порядке.

select 
      date_format(justDates.FirstOfMonth,'%M %Y') ShowDate,
      ifnull(PreSummary.kg, 0) as kg,
      ifnull(PreSummary.ka, 0) as ka,
      ifnull(PreSummary.lr, 0) as lr,
      ifnull(PreSummary.lh, 0) as lh,
      ifnull(PreSummary.lb, 0) as lb,
      ifnull(PreSummary.ll, 0) as ll,
      ifnull(PreSummary.nc, 0) as nc,
      ifnull(PreSummary.na, 0) as na,
      ifnull(PreSummary.sbs, 0) as sbs,
      ifnull(PreSummary.stbs, 0) as stbs,
      ifnull(PreSummary.total, 0) as Total
   from
      ( SELECT @dt:= date_add( @dt, interval 1 month ) FirstOfMonth
          FROM (select @dt := '2010-01-01' ) vars,
               opr.t_temuan
               LIMIT 12 ) JustDates
      left join 
      ( Select 
              date_format(a.tanggal,'%M %Y') ShowDate,
              sum(a.kg) as kg,
              sum(a.ka) as ka,
              sum(a.lr) as lr,
              sum(a.lh) as lh,
              sum(a.lb) as lb,
              sum(a.ll) as ll,
              sum(a.nc) as nc,
              sum(a.na) as na,
              sum(a.sbs) as sbs,
              sum(a.stbs) as stbs,
              sum(a.kg+a.ka+a.lr+a.lh+a.sbs+a.lb+a.ll+a.nc+a.na+a.stbs) as total
         from 
            opr.t_temuan as a
         where
                a.id_site=197
            and a.tanggal between '2010-02-01' and '2011-01-31'
            and a.type in ( 'f', 'i')
         group by
             1 ) PreSummary
      on JustDates.ShowDate = PreSummary.ShowDate
  order by
      JustDates.FirstOfMonth
person DRapp    schedule 08.03.2011