Izracunavanje prosjeka iz baze

Zanima me kako iz baze podataka izdvojiti sve one brojeve koji se nalaze pod istim id-om te od istih izracunati prosjek, a ako se unutar tih brojeva nalaze jedinice tada samo zbrojiti koliko ima jedinica i ispisati na stranici?

Kod prosjeka treba zaokruziti na cijeli broj!

Nisam posve siguran kako bi se to izvelo u jednom upitu, s obzirom da se radi o posve različitim
kodomenama podataka. Čudilo bi me da se neda i elegantnije izvesti, ali eto…
Dajem dolje par stvari koje su mi pale na pamet. SQL je onaj koji Jet (Access) podržava.

Neka postoji slijedeća tablica.

CREATE TABLE ocjene
(
    ucenik CHAR(10) NOT NULL
  , ocjena TINYINT NOT NULL
);

Slijedeći podaci stoje u tablici:

INSERT INTO ocjene VALUES( "marko", 1 );
INSERT INTO ocjene VALUES( "marko", 3 );
INSERT INTO ocjene VALUES( "marko", 2 );
INSERT INTO ocjene VALUES( "marko", 1 );
INSERT INTO ocjene VALUES( "ivica", 4 );
INSERT INTO ocjene VALUES( "ivica", 4 );
INSERT INTO ocjene VALUES( "ivica", 5 );
INSERT INTO ocjene VALUES( "ivica", 3 );
INSERT INTO ocjene VALUES( "goran", 2 );
INSERT INTO ocjene VALUES( "goran", 1 );
INSERT INTO ocjene VALUES( "goran", 1 );
INSERT INTO ocjene VALUES( "goran", 1 );
INSERT INTO ocjene VALUES( "lovro", 5 );
INSERT INTO ocjene VALUES( "lovro", 5 );
INSERT INTO ocjene VALUES( "lovro", 5 );
INSERT INTO ocjene VALUES( "lovro", 4 );

Ovaj upit neka se zove [prosjek] i neka je pohranjen u bazi (kao pogled ili procedura):

Upit daje prosjek prolaznih ocjena svakog ucenika, bez obzira na jedinice.

SELECT
    ucenik
  , ROUND(AVG(ocjena)) AS prosjek
FROM
    ocjene
WHERE
    ocjena > 1
GROUP BY
    ucenik;

Ovaj upit neka se zove [komadi] i neka je pohranjen u bazi (kao pogled ili procedura):

Upit daje broj komada samo za one ucenike koji imaju barem jedan komad.

SELECT
    ucenik
  , COUNT(*) AS komadi
FROM
    ocjene
WHERE
    ocjena = 1
GROUP BY
    ucenik;

Ovaj upit daje tablicu svih ucenika oblika (ucenik, prosjek, komadi). Iz te tablice se
moze odrediti da li ucenik prolazi ili ne prema tome da li je u polju komadi NULL vrijednost ili ne.
Koriste se pohranjeni upiti [prosjek] i [komadi].

SELECT
    prosjek.ucenik AS ucenik
  , prosjek.prosjek AS prosjek
  , komadi.komadi AS komadi
FROM
    prosjek
    LEFT JOIN
    komadi
    ON
    prosjek.ucenik = komadi.ucenik

Ovaj upit daje prosjek samo onih ucenika koji nemaju komade:
Koriste se pohranjeni upiti [prosjek] i [komadi].

SELECT
    *
FROM
    prosjek
WHERE
    ucenik NOT IN ( SELECT ucenik FROM komadi );

Ovaj upit daje tablicu oblika (ucenik, prosjek-ili-komadi, oznaka-prolaska).
U stupcu prosjek-ili-komadi stoji prosjek za one koji su prosli, a broj komada za one koji su pali.
Koriste se pohranjeni upiti [prosjek] i [komadi].

SELECT
    ucenik
  , prosjek AS [prosjek ili komadi]
  , "PROLAZ"
FROM
    prosjek
WHERE
    ucenik NOT IN ( SELECT ucenik FROM komadi )
UNION
SELECT
    ucenik
  , komadi
  , "PAD"
FROM
    komadi
ORDER BY
    ucenik
    ;

Ovaj upit je poput upita [prosjek], samo sto ne ukljucuje ucenike koji imaju jedinice:
Ne koriste se pohranjeni upiti [prosjek] i [komadi].

SELECT
    ucenik
  , ROUND(AVG(ocjena)) AS prosjek
FROM
    ocjene AS T1
GROUP BY
    ucenik
HAVING
    0 = (
            SELECT
                COUNT(*)
            FROM
                ocjene AS T2
            WHERE
                T2.ucenik = T1.ucenik
                AND
                T2.ocjena = 1
        )

Alternativna izvedba:

SELECT
    ucenik
  , ROUND(AVG(ocjena)) AS prosjek
FROM
    ocjene
WHERE
    ucenik NOT IN ( SELECT ucenik FROM ocjene WHERE ocjena = 1 GROUP BY ucenik )
GROUP BY
    ucenik

(Operacije “element-iz-skupa” su vremenski skupe.)

A onda može i ovo bez pohranjenih upita:

SELECT
    ucenik
  , ROUND(AVG(ocjena)) AS [prosjek ili pad]
  , "PROLAZ"
FROM
    ocjene
WHERE
    ucenik NOT IN ( SELECT ucenik FROM ocjene WHERE ocjena = 1 GROUP BY ucenik )
GROUP BY
    ucenik
UNION
SELECT
    ucenik
  , COUNT(*)
  , "PAD"
FROM
    ocjene
WHERE
    ocjena = 1
GROUP BY
    ucenik
ORDER BY
    ucenik

Zahvaljujem na odgovoru, ali i dalje ne uspijevam srediti problem, ja sam vam inace “malo bolji” programer.

Prosli put nisam baš bio previše jasan pa ću pokušati ponovo. U stvari zadatak izgleda ovako;
Potrebno je napraviti stranicu razred_uspijeh.asp koja će za sve ucenike iz odabranog razreda ispisati ime, prezime,broj opr. izostanaka, broj neop. izostanaka, prolaznu ocjenu ili broj komada, te za svakog ucenika posebno omoguciti skok na stranicu ucenici.asp tako što joj pošalje ucenik_id.

Statistiku za pojedini razred odabire posjetitelj tako što se s stranice popis_razreda.asp posalje stranici razred_uspijeh.asp razred_id.

Zadana je baza “imenik.mdb” koja se sastoji od vise tablica,a meni potrebne su;

ucenik: id, razred_id, ime, prezime, izo_opr, izo_nop
z_ocjena: id, ucenik_id, predmet_id, ocjena

Ako bi mi netko mogao napisati kod za stranicu razred_uspijeh.asp bio bih mu jako zahvalan i ima pice kad dođe u Križevce!

Dolje ti je upit koji trebaš.

Prvo promjeni tip parametra p_razred_id iz CHAR(2) u ono što koristiš.

Onda ga ubaci u bazu (lokalno na PC-u) i pohrani pod nekim imenom.

Onda ga otvori. Pitat će te da uneseš p_razred_id, unesi oznaku razreda i vidi da li je to to.

Nakon toga bi trebao vidjeti kako se iz ASP-a (a) ovori pohranjeni upit (kroz objekt), (b) pridruže vrijednosti parametara, © otvori recordset iz objekta s pohranjenim upitom.

Onda iteriraš kroz recordset i ispisuješ polja. Mislim da je jasno šta je koje polje. Polje prolazi je True za one koji prolaze, False za one koji padaju.

Ako ne znaš pohraniti upit, otvoriti ga i izvršiti, onda u ASP kodu drži taj upit u String varijabli kao dolje:
Dim strSQL
strSQL = "SELECT …"
Samo što ti u tom slučaju ne trebaju prva tri retka (od PARAMETERS do točka-zarez), tek sve nadalje od SELECT.
Tada napraviš ovo:
Dim strT
strT = Replace(strSQL, “p_razred_id”, vaRazredId)

I onda sa strT otvoriš Recordset onako kako to i inače radiš.
Podrazumijevam da je u vaRazredId oznaka razreda. Ako je TIP PODATKA razred_id TEXT, onda koristi
strT = Replace(strSQL, “p_razred_id”, “”"" & vaRazredId & “”"")

(Uoči 4 navodnika - dva vanjska su navodnici od stringa, a dva nutarnja znače zapravo jedan navodnik.)

PARAMETERS
    p_razred_id CHAR(2)
    ;
SELECT
    z_ocjena.ucenik_id AS ucenik_id
  , FORMAT(ROUND(AVG(z_ocjena.ocjena),2),"#.00") AS prosjek
  , ROUND(AVG(z_ocjena.ocjena),0) AS zaklj_ocjena
  , 0 AS komadi
  , FIRST(ucenik.izo_opr) AS izo_opr
  , FIRST(ucenik.izo_nop) AS izo_nop
  , FIRST(ucenik.ime) AS ime
  , FIRST(ucenik.prezime) AS prezime
  , TRUE AS prolazi
FROM
    z_ocjena
    INNER JOIN
    ucenik
    ON
    z_ocjena.ucenik_id = ucenik.id
WHERE
    ucenik.razred_id = p_razred_id
GROUP BY
    ucenik_id
HAVING
    0 = (
        SELECT
            COUNT(*)
        FROM
            z_ocjena AS T
        WHERE
            T.ucenik_id = z_ocjena.ucenik_id
            AND
            T.ocjena = 1
        )
UNION
SELECT
    z_ocjena.ucenik_id
  , ""
  , ""
  , COUNT(*)
  , FIRST(ucenik.izo_opr)
  , FIRST(ucenik.izo_nop)
  , FIRST(ucenik.ime)
  , FIRST(ucenik.prezime)
  , FALSE AS prolazi
FROM
    z_ocjena
    INNER JOIN
    ucenik
    ON
    z_ocjena.ucenik_id = ucenik.id
WHERE
    ucenik.razred_id = p_razred_id
    AND
    z_ocjena.ocjena = 1
GROUP BY
    z_ocjena.ucenik_id
ORDER BY
    prezime
  , ime
  , ucenik_id

Hvala! Kad isprobam javit cu ti da li radi!

Obavezno provjeri računom na ruku da li funkcija ROUND zaokružuje dobro. Naime, ponekad takve funkcije 0.5 zaokruže na manju, a ponekad na veću vrijednost. Također neke uzimaju slijedeće decimalno mjesto, a neke naprosto otpile sve iza traženog decimalnog mjesta. Simuliraj takve situacije. Nisam nikada istraživao, ali se sjećam da sam nailazio na situacije kada funkcija koja bi po svakoj logici trebala raditi matematičko zaokruživanje radi neko vlastito.

ljudi trebam pomoc dobio sam zadatak da napravim tabelu u acess-u unosenjem podataka u tabelu

p q
True True
True False
False True
False False
*False False
to je ta tabela u accesu…to sam uradio e sada trebam napraviti upit koji prikazuje tabele logickih operacija…kako to da uradim ovako treba izgledati ta tabela

p q NOTp i ili eks_ili ekv imp
True True 0 -1 -1 0 -1 -1
True False 0 0 -1 -1 0 0
False True -1 0 -1 -1 0 -1
False False -1 -1 0 0 -1 -1
*False False

moze pomoc molim vas


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja