Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Outer join na calendar table

[es] :: MySQL :: Outer join na calendar table

[ Pregleda: 1679 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Outer join na calendar table16.01.2011. u 00:07 - pre 161 meseci
Ukratko:
Imam jednu tabelu koja ima time_tracking record-e (nula, jedan ili vise record-a po danu). Treba da napravim report koji bi mi izlistao total za svaki dan ukljucujuci i dane za koje nema nijedan time_tracking record. U principu, problem se svodi na pravljenje outer join-a sa "calendar" tabelom, gde bi mi za svaki dan bilo sumirani total time_tracking-a.

Nasao sam nekoliko solucija ( za oracle, mssql, mada i "uopstena sql" resenja), koja podrazumevaju:
-ili kreiranje unapred calendar tabele
-ili stored procedura koja kreira temp tabelu pa odradi join
-ili ogroman select koji bi sadrzao 31 select.
....
....

Da li neko ima neko iskustvo u vezi sa slicnim problemom tj. koje od resenja bi bilo najpogodnije za MySQL?

Unapred hvala,
Igor
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Outer join na calendar table16.01.2011. u 02:02 - pre 161 meseci
ako sam te dobro shvatio, problem je za dane kada nema nijedan slog - ti bi hteo da izbacis "dan: 0" ? na zalost nije mysql nista pametniji po tom pitanju od ostalih .. obicno to naprave ljudi u kombinaciji sa klijentom .. nesto tipa

Code:

 for ($i=1;$i<32;$i++) $datum[$i]=0;
 $res=mysql_query("select dan, sum(*) as koliko from report group by dan");
 while ($row=mysql_fetch_assoc($res)) $datum[$row['dan']] = $row['koliko'];


ako bas hoces da ti to vrne sql ... neki union 30-31 upita ili neki join sa tabelom ili napravis temp tabelu ili ..
 
Odgovor na temu

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Re: Outer join na calendar table16.01.2011. u 15:10 - pre 161 meseci
Hvala na brzom odgovoru.

U principu mi treba da sve podatke vrati mysql iz jednog upita jer upit koristim u JasperReports-u.
Sto se tice takvog resenja koje od sledecih resenja bi MySql to bolje podnosio:

1. 31 dodatni select kao npr:
Code:
select distinct b.USER_ID `user`, year(a.ENTRY_DATE) `y`, month(a.ENTRY_DATE) `m`, b.PROJECT_ID `project`,
(select a1.HOURS from TIMESHEET_ENTRY a1 where a1.ENTRY_DATE=concat(`y`,'-',`m`,'-','01') and a1.ASSIGNMENT_ID=a.ASSIGNMENT_ID) `d1`,
(select a1.HOURS from TIMESHEET_ENTRY a1 where a1.ENTRY_DATE=concat(`y`,'-',`m`,'-','02') and a1.ASSIGNMENT_ID=a.ASSIGNMENT_ID) `d2`,
...
...
(select a1.HOURS from TIMESHEET_ENTRY a1 where a1.ENTRY_DATE=concat(`y`,'-',`m`,'-','30') and a1.ASSIGNMENT_ID=a.ASSIGNMENT_ID) `d30`,
(select a1.HOURS from TIMESHEET_ENTRY a1 where a1.ENTRY_DATE=concat(`y`,'-',`m`,'-','31') and a1.ASSIGNMENT_ID=a.ASSIGNMENT_ID) `d31`
from TIMESHEET_ENTRY a 
join PROJECT_ASSIGNMENT b on a.ASSIGNMENT_ID = b.ASSIGNMENT_ID;



2. Uvodjenjem "vestacke" Calendar tabele, npr svi datumi od 2000-2030 i pravljenjem outer join-a sa tom tabelom.


3. ili da se kreira zeljeni output iz stored procedure sa koriscenjem temp tabele

Hvala,
Igor
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Outer join na calendar table16.01.2011. u 17:16 - pre 161 meseci
nema neke velike razlike sto se mysql-a tice osim sto

a1.ENTRY_DATE=concat(`y`,'-',`m`,'-','30')

pravi problem za indexiranje pa ce to da bude sporo ..

ja bi licno isao sa verzijom 2
 
Odgovor na temu

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Re: Outer join na calendar table17.01.2011. u 13:59 - pre 161 meseci
Hvala. Idem onda sa opcijom 2.

Igor
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Outer join na calendar table17.01.2011. u 14:02 - pre 161 meseci
obzirom da ti je 15min da probas sve 3 opcije mozda je bolje da probas .. ja bi isao sa drugom kao sto rekoh ali ces biti 100% siguran + ces kojesta nauciti ako probas sam sve tri verzije :)
 
Odgovor na temu

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Re: Outer join na calendar table24.01.2011. u 08:50 - pre 161 meseci
Citat:
bogdan.kecman: obzirom da ti je 15min da probas sve 3 opcije mozda je bolje da probas .. ja bi isao sa drugom kao sto rekoh ali ces biti 100% siguran + ces kojesta nauciti ako probas sam sve tri verzije :)


Nisam bas expert da bi mogao sve 3 za 15min, a nemam vremena da se puno zadrzavam na ovome. :-)

Elem, odradih nesto poput ovoga:
http://www.richnetapps.com/usi...ily-sales-reports-filled-gaps/

Znaci,

1. Create calendar table:
Code:
CREATE TABLE CALENDAR (datefield DATE);


2. Create stored procedure:

Code:
DELIMITER |
CREATE PROCEDURE fill_calendar(start_date DATE, end_date DATE)
BEGIN
  DECLARE crt_date DATE;
  SET crt_date=start_date;
  WHILE crt_date < end_date DO
    INSERT INTO CALENDAR VALUES(crt_date);
    SET crt_date = ADDDATE(crt_date, INTERVAL 1 DAY);
  END WHILE;
END |
DELIMITER ;


3. Fill the calendar table with specific range:
Code:
CALL fill_calendar('2010-01-01', '2015-12-31');



Naravno, korak 3. parametrizovati po zelji :-) tj. koliko procenite da cete ostati u firmi. ;-)






 
Odgovor na temu

[es] :: MySQL :: Outer join na calendar table

[ Pregleda: 1679 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.