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

sql problem, Moze li sa jednim upitom?

[es] :: Baze podataka :: sql problem, Moze li sa jednim upitom?

[ Pregleda: 1357 | Odgovora: 8 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Bojann
Zrenjanin

Član broj: 13255
Poruke: 197
*.ptt.yu



Profil

icon sql problem, Moze li sa jednim upitom?19.05.2004. u 01:10

U pitanju je jedan sql problem.
Ovako:
Postoji jedna tabela sa poljima npr:
-Ime
-uplatio(logicki tip true/false)
-datum

Potrebno je da kao rezultat upita dobijem grupisano po imenu, podatke za svakog coveka, koliko je puta uplatio(odnosno kad je polje uplatio=true),ukupan broj pojavljivanja coveka(i kad je uplatio=true i kad je false) i procenat kad je uplata=true.

Konkretno na primeru:

ime uplatio=true ukupno(uplatio je bilo sta) procenat

Pera 5 10 50%
Sima 4 6 66%
Maja 5 8 62,5%

Da li je ovako nesto moguce sa jednim upitom. Problem je u sledecem. Ako grupisem podatke po imenu sto svakako treba i postavim uslov "where uplatio=true", tada broji samo te slucajeve a ukupne ne broji. Zato i pitam da li je ovo moguce jednim upitom i kako?

19.05.2004. u 01:10 

Dejan Topalovic
Dejan Topalović
Oracle DBA & PL/SQL Developer, Erste Sparinvest (..
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at

ICQ: 20142302
Sajt: www.outsourcing-it.com


Profil

icon Re: sql problem, Moze li sa jednim upitom?19.05.2004. u 03:07
Ako se radi o MySQL bazi (verzija min. 4.1), onda bi se moglo uraditi pomocu podupita (subqueries):
Code:
SELECT t1.Ime, t2.num AS Uplaceno, t3.num2 AS Uplatnica, (t2.num/t3.num2)*100 AS '%' FROM
uplate AS t1,
(SELECT Ime, COUNT(*) AS num
FROM uplate
WHERE uplatio=TRUE
GROUP BY Ime
) AS t2,
(SELECT Ime, COUNT(*) AS num2
FROM uplate
GROUP BY Ime
) AS t3
WHERE t1.Ime=t2.Ime AND t1.Ime = t3.Ime
GROUP BY t1.Ime;


Je li to rjesenje koje ti treba? Ako nije, trazicemo drugo kad se naspavam
19.05.2004. u 03:07 

Bojann
Zrenjanin

Član broj: 13255
Poruke: 197
*.ptt.yu



Profil

icon Re: sql problem, Moze li sa jednim upitom?19.05.2004. u 14:37
Citat:
StRiPy:
Ako se radi o MySQL bazi (verzija min. 4.1), onda bi se moglo uraditi pomocu podupita (subqueries):
Code:
SELECT t1.Ime, t2.num AS Uplaceno, t3.num2 AS Uplatnica, (t2.num/t3.num2)*100 AS '%' FROM
uplate AS t1,
(SELECT Ime, COUNT(*) AS num
FROM uplate
WHERE uplatio=TRUE
GROUP BY Ime
) AS t2,
(SELECT Ime, COUNT(*) AS num2
FROM uplate
GROUP BY Ime
) AS t3
WHERE t1.Ime=t2.Ime AND t1.Ime = t3.Ime
GROUP BY t1.Ime;


Je li to rjesenje koje ti treba? Ako nije, trazicemo drugo kad se naspavam :)





Ja radim sa delpijem i paradox7 bazom. Znaci koristim bde komponente i u odeljku TQuery.sql treba da unesem kod.
Probao ovaj tvoj predlog, ali on meni prijavi gresku cim postavim podupit u odeljak from (nisam zano da ovako nesto uopste i moze). Probao sam na nekom prostom primeru i izgleda da stvarno ne moze da se u odeljak from ubaci podupit, bar ne moze u TQuery.sql
19.05.2004. u 14:37 

Dejan Topalovic
Dejan Topalović
Oracle DBA & PL/SQL Developer, Erste Sparinvest (..
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at

ICQ: 20142302
Sajt: www.outsourcing-it.com


Profil

icon Re: sql problem, Moze li sa jednim upitom?19.05.2004. u 15:44
Tako sam i mislio, da se radi o drugoj bazi No, nema veze.
Nisam radio nikako sa Paradoxom, ali pokusaj ovu metodu (u slucaju da Paradox podrzava CASE ...):

Code:
SELECT Ime,sum(case when uplatio=TRUE then 1 else 0 end) as Uplaceno,
    count(*) AS Ukupno,(sum(case when uplatio=TRUE then 1 else 0 end)/count(*))*100 AS "%"
FROM uplate
GROUP BY Ime;


Inace, ovo rjesenje radi odlicno i u MySQL-u. Bolje je od onog gore koje sam napisao nabrzaka u 4 ujutro
19.05.2004. u 15:44 

_owl_
Centar - BG

Član broj: 318
Poruke: 989
*.drenik.net

Sajt: home.drenik.net/~owl


Profil

icon Re: sql problem, Moze li sa jednim upitom?19.05.2004. u 19:00
Samo da napomenem da je po SQL-u neophodno da u GROUP BY klauzuli imas sva polja po kojima grupises pa i ona koja sadrze agregatne funkcije tj za dati primer bi bilo
Code:

GROUP BY Ime,sum(case when uplatio=TRUE then 1 else 0 end),
    count(*), (sum(case when uplatio=TRUE then 1 else 0 end)/count(*))*100

Owl
19.05.2004. u 19:00 

noviKorisnik

Član broj: 13216
Poruke: 4513
*.dialup.neobee.net.



Profil

icon Re: sql problem, Moze li sa jednim upitom?19.05.2004. u 19:41
??? ili sam totalno zarđao? odo' na spavanje...
19.05.2004. u 19:41 

Dejan Topalovic
Dejan Topalović
Oracle DBA & PL/SQL Developer, Erste Sparinvest (..
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at

ICQ: 20142302
Sajt: www.outsourcing-it.com


Profil

icon Re: sql problem, Moze li sa jednim upitom?19.05.2004. u 20:48
@_owl_: Da, u neku ruku si u pravu. Treba se drzati SQL standarda.
Medjutim, MySQL ima zanimljive karakteristike u vezi GROUP BY:
http://dev.mysql.com/doc/mysql/en/GROUP-BY-hidden-fields.html

Copy/paste jednog dijela teksta sa gorenavedene adrese:
Citat:
MySQL extends the use of GROUP BY so that you can use columns or calculations in the SELECT list that don't appear in the GROUP BY clause. This stands for any possible value for this group. You can use this to get better performance by avoiding sorting and grouping on unnecessary items. For example, you don't need to group on customer.name in the following query:

mysql> SELECT order.custid, customer.name, MAX(payments)
-> FROM order,customer
-> WHERE order.custid = customer.custid
-> GROUP BY order.custid;

In standard SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant if you don't run in ANSI mode.

Do not use this feature if the columns you omit from the GROUP BY part are not unique in the group! You will get unpredictable results.
...

Note that if you are using MySQL 3.22 (or earlier) or if you are trying to follow standard SQL, you can't use expressions in GROUP BY or ORDER BY clauses. You can work around this limitation by using an alias for the expression:

mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name
-> GROUP BY id, val ORDER BY val;

In MySQL 3.23 and up, aliases are unnecessary. You can use expressions in GROUP BY and ORDER BY clauses. For example:

mysql> SELECT id, FLOOR(value/100) FROM tbl_name ORDER BY RAND();



@noviKorisnik: Sta se desilo?
19.05.2004. u 20:48 

noviKorisnik

Član broj: 13216
Poruke: 4513
194.247.222.*



Profil

icon Re: sql problem, Moze li sa jednim upitom?20.05.2004. u 08:22
Prvo me je zbunilo pominjanje korištenja agregatnih funkcija u GROUP BY klauzuli.
Drugo - nije mi jasno koje bi bilo značenje sledećeg q
Code:
SELECT Ime, count(*)
FROM Uplate
GROUP BY Ime, count(*)

- šta traži count(*) u GROUP BY? Zar se count(*) ne izračunava na osnovu grupisanja po imenu?
20.05.2004. u 08:22 

Dejan Topalovic
Dejan Topalović
Oracle DBA & PL/SQL Developer, Erste Sparinvest (..
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at

ICQ: 20142302
Sajt: www.outsourcing-it.com


Profil

icon Re: sql problem, Moze li sa jednim upitom?20.05.2004. u 10:08
A dobro, to se mozda _owl_ malo zeznuo Zezne se svako katkad. Pogotovo ja kad sam nenaspavan
Naravno da ne ide count(*) u GROUP BY clause.
20.05.2004. u 10:08 

[es] :: Baze podataka :: sql problem, Moze li sa jednim upitom?

[ Pregleda: 1357 | Odgovora: 8 ]

Postavi temu Odgovori

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