[ Bojann @ 23.03.2005. 22:40 ] @
U pitanju je upit, dakle kako sastaviti sql kod za sledece:

tabela masina:


ime_masine, id,ispravnost(true/false),proizvodjac

Sad treba da rangiram proizvodjace po procentu ispravnosti masina. Primer:

1.proizvodjac1 4(ispravne) 1(neispravna) 80%
2.proizvodjac2 4 4 50%
3.proizvodjac3 2 3 40%

Kako?
[ Dejan Topalovic @ 23.03.2005. 23:36 ] @
Bilo mi dosadno, pa sam odlucio malo perverzije izvoditi ;)
Code:

CREATE TABLE masina(
id INT(4) NOT NULL AUTO_INCREMENT,
proizvodjac VARCHAR(50),
ime_masine VARCHAR(50),
ispravnost ENUM('true','false') NOT NULL,
PRIMARY KEY (id));

SELECT proizvodjac, SUM(CASE ispravnost WHEN true THEN 1 ELSE 0 END) AS "Ispravno", COUNT(*)-SUM(CASE ispravnost WHEN true THEN 1 ELSE 0 END) AS "Neispravno", CONCAT(((SUM(CASE ispravnost WHEN true THEN 1 ELSE 0 END)/COUNT(*))*100),"%") AS "%" FROM masina GROUP BY proizvodjac ORDER BY 3 DESC;


Cista perverzija :)
Ne preporucujem za svakodnevnu upotrebu.

Ah da, zaboravih dodati - ovo je testirano na MySQL 4.1.
[ CandyMan @ 24.03.2005. 09:34 ] @
Osnovno je da moraš da imaš dva upita. Prvi treba da ti da ukupan broj mašina za svakog proizvođača, a drugi broj ispravnih mašina za svakog proizvođača npr:
Q1:
Code:

select proizvodjac, count(*) ukupno
  from masine
group by proizvodjac;

Q2:
Code:

select proizvodjac, count(*) ukupno
  from masine
 where ispravna = TRUE
group by proizvodjac;

Q3:
Code:

select Q2.proizvodjac, round((Q2.ukupno/Q1.ukupno)*100,2)
  from Q1,Q2
 where Q2.prozvodjac = Q1.prozvodjac


Verovatno je u Q3 moguće Q1 i Q2 zameniti navedenim upitima da bi se dobio jedan upit, ali to već zavisi od platforme.

U prilogu je predlog rešenja u Access-u.
[ Dejan Topalovic @ 24.03.2005. 22:54 ] @
Nakon one perverzije, evo jedno normalnije rjesenje:
Code:

SELECT t1.proizvodjac, t1.ispravno, t2.neispravno, ROUND((t1.ispravno/(t1.ispravno+t2.neispravno))*100) AS "%"
FROM
(SELECT proizvodjac, COUNT(*) AS ispravno FROM masina WHERE ispravnost = true GROUP BY proizvodjac) AS t1,
(SELECT proizvodjac, COUNT(*) AS neispravno FROM masina WHERE ispravnost <> true GROUP BY proizvodjac) AS t2
WHERE t1.proizvodjac = t2.proizvodjac
ORDER BY 4 DESC;

Ustedio sam jedan COUNT(*) za ukupan broj masina. Radi na MySQL 4.1.
[ CandyMan @ 25.03.2005. 07:07 ] @
Uštedeo? Nisam baš siguran...
[ Dejan Topalovic @ 25.03.2005. 11:15 ] @
Ustvari, dodje na isto :) Radio COUNT(*) za neispravne masine, pa ih sabrao sa ispravnima, ili radio COUNT(*) za ukupan broj masina, pa od njega oduzeo broj ispravnih, da bih dobio broj neispravnih - na kraju je svejedno.

Ne rece nam Bojann da li mu pomazu ovi SQL izrazi ... ?
[ _owl_ @ 26.03.2005. 00:24 ] @
Pa nije bas isto. Mislim da je Stripy-evo prvo resenje najbolje sto se tice performansi (jedan SELECT sa GROUP BY)
[ Bojann @ 26.03.2005. 00:27 ] @
Citat:
StRiPy
Ne rece nam Bojann da li mu pomazu ovi SQL izrazi ... ?


Pa, kad sam video onu perverziju odustao sam od te zamisli ali mozda cu ova resenja primeniti neki drugi put
[ Dejan Topalovic @ 26.03.2005. 17:36 ] @
Pa jesi li onda nasao neko drugo rjesenje? Obavijesti nas u svakom slucaju, kakav query si na kraju slozio.
[ CandyMan @ 27.03.2005. 22:16 ] @
Ne verujem da može da ponudi neko bolje rešenje, ovo što smo mu ponudili je "najčistije" - nema ništa osim SQL-a.
Što se perverzija tiče, ako pogleda neke SQL teme videće da ovo i nije tako strašno.
[ Bojann @ 27.03.2005. 22:31 ] @
Pa mogao sam da biram tako da sam napravio upit drugog tipa:)