[ Bojann @ 19.05.2004. 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?

[ Dejan Topalovic @ 19.05.2004. 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
[ Bojann @ 19.05.2004. 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
[ Dejan Topalovic @ 19.05.2004. 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
[ _owl_ @ 19.05.2004. 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
[ noviKorisnik @ 19.05.2004. 19:41 ] @
??? ili sam totalno zarđao? odo' na spavanje...
[ Dejan Topalovic @ 19.05.2004. 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?
[ noviKorisnik @ 20.05.2004. 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?
[ Dejan Topalovic @ 20.05.2004. 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.