NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Martin
Člen
Avatar
Martin:22.2.2016 18:13

Ahojte, prosím vás, potreboval by som pomôcť. Totižto začal som trochu pracovať s oracle databázou a som naozaj len taký začiatočník, preto sa vám možno bude nasledujúca úloha zdať jednoduchá, no s ňou momentálne neviem pohnúť.

Takže predstavte si databázu, kde máte nejaký primary key (napr. nejaké ID), potom dátum žiadosti (s tým, že ide o dataTime, nie iba data) a potom nejakú sumu. Sú to vlastne ako keby žiadosti o pôžičku - teda ID klienta, dátum podania a suma.

A teraz mojím zadaním bolo, že mám vyhľadať 5 dátumov (napr. 3. máj 2016, atď.), kedy bolo dosiahnutých najväčší počet žiadostí. K tomu som použil funkciu trunc na datatime, potom goup by trunc datatime a následne jednoduchý order desc.

Ale potom som mal spraviť zadanie, kde som mal vyhľadať 5 mesiacov, v rámci ktorých bol podaný najväčší počet žiadostí, a to som už nevedel. Mňa ako amatéra napadlo niečo typu "group by month", aj som googlil, ale nenatrafil som na nič, čo by mi fungovalo...

Mohli by ste ma, prosím, nejak navigovať, ktorým smerom sa vybrať a ako by som túto úlohu mohol vyriešiť? Ďakujem.

 
Odpovědět
22.2.2016 18:13
Avatar
Odpovídá na Martin
Neaktivní uživatel:22.2.2016 19:14

Co zkusit tohle?
https://community.oracle.com/thread/2224569?…

Oracle má velký rozdíly oproti SQL serveru i MySQL, nemyslím si, že to mají udělaný lépe ... :)

Nahoru Odpovědět
22.2.2016 19:14
Neaktivní uživatelský účet
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:23.2.2016 7:36

Ahoj, pokud mas dateTime a potrebujes z neho dostat jednotlive polozky tak podle mych letitych poznamek by to mela byt funkce extract. Tady na me vyskocila i na googlu https://docs.oracle.com/…tions050.htm.

 
Nahoru Odpovědět
23.2.2016 7:36
Avatar
Martin
Člen
Avatar
Martin:23.2.2016 19:34

Chlapci v prvom rade ďakujem za ochotu.

Prešiel som si tie linky čo ste mi poslali, no nie som si úplne istý či funkcia "extract" je tá správna. Pretože extract mi síce vyhodí názov mesiacu, ale ja to potrebujem, aby výsledok vyzeral napríklad nasledovne:

jan 2011 400

Teda v jednoduchosti povedané, príkaz musí najprv spraviť nejaký "count" s rovnakým dátumom (pretože v jeden deň mohlo prísť XY žiadostí, alebo aj žiadna) a potom následne tieto počty "zgroupit" podľa mesiacov a zobraziť mi 5 mesiacov, v rámci ktorých bolo prijatých najviac žiadostí.

Máme napríklad:

ID DateTime Suma
(čas nebudem vypisovať)
1 1.1.2011 4000
2 1.1.2011 2000
3 1.1.2011 5000
4 1.1.2011 4900
5 5.2.2012 3200
6 5.2.2012 3100
. . .
. . .
. . .
x 12.4.2014 1400

a výsledok by bol napríklad:

jan 2011 40
feb 2015 39
apr 2014 36
mar 2011 30

Interpretácia: v priebehu januára 2011 sme zaevidovali najväčší počet žiadostí o pôžičku. Bolo ich až 40. Druhý najväčší počet žiadostí bol evidovaný vo februári 2015. Vtedy bolo prijatých 39 žiadostí o pôžičku. A tak ďalej...

Ako teda postupovať? extract to predsa nebude, že?

Editováno 23.2.2016 19:35
 
Nahoru Odpovědět
23.2.2016 19:34
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:24.2.2016 8:40

Ahoj,
samotny extract to samozrejme nebude. Chces udelat count pres mesice preci ne? Z tveho dotazu jsem pochopil, ze nevis jak to zpracovat na ten mesic z toho datetimu. Extractem ziskas mesic, kterej pouzijes jako group podminku a pokud chces pocet tak nejakej count na zacatek.

 
Nahoru Odpovědět
24.2.2016 8:40
Avatar
Vít Pleskot
Člen
Avatar
Vít Pleskot:24.2.2016 9:21
CREATE TABLE "ZADOSTI" ("ID" NUMBER PRIMARY KEY, "DATUM" TIMESTAMP (6), "CASTKA" NUMBER);

Insert into ZADOSTI (ID,DATUM,CASTKA) values ('1',to_timestamp('14.01.16 08:03:40,871000000','DD.MM.RR HH24:MI:SSXFF'),'4000');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('2',to_timestamp('14.01.16 12:04:30,268000000','DD.MM.RR HH24:MI:SSXFF'),'1000');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('3',to_timestamp('20.01.16 12:04:41,217000000','DD.MM.RR HH24:MI:SSXFF'),'1300');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('4',to_timestamp('25.01.16 12:20:48,770000000','DD.MM.RR HH24:MI:SSXFF'),'3340');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('5',to_timestamp('08.02.16 08:05:04,781000000','DD.MM.RR HH24:MI:SSXFF'),'500');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('6',to_timestamp('11.02.16 08:05:11,142000000','DD.MM.RR HH24:MI:SSXFF'),'3900');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('7',to_timestamp('24.02.16 08:05:20,801000000','DD.MM.RR HH24:MI:SSXFF'),'2000');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('8',to_timestamp('10.03.16 08:05:24,842000000','DD.MM.RR HH24:MI:SSXFF'),'2400');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('9',to_timestamp('18.03.16 08:05:31,741000000','DD.MM.RR HH24:MI:SSXFF'),'5400');
Insert into ZADOSTI (ID,DATUM,CASTKA) values ('10',to_timestamp('08.04.16 08:05:38,007000000','DD.MM.RR HH24:MI:SSXFF'),'1500');

SELECT COUNT(ID) pocet_zadosti, TO_CHAR(TO_DATE(EXTRACT(MONTH FROM DATUM), 'MM'), 'MONTH') mesic
FROM zadosti
GROUP BY (extract(month from DATUM))
ORDER BY extract(month from DATUM) ASC;

Neni to nejhezci, ale myslim, ze by to mohlo byt to, co potrebujes.

 
Nahoru Odpovědět
24.2.2016 9:21
Avatar
Martin
Člen
Avatar
Martin:29.2.2016 16:13

Chlapci, sorry, že až teraz píšem. Nakoniec som prišiel na riešenie a je samozrejme totožné s riešením od Vítu. Bolo treba použiť TO_CHAR a následne group by podľa TO_CHAR (bez extract)

Ďakujem ešte raz za príspevky

 
Nahoru Odpovědět
29.2.2016 16:13
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.