Zapytanie SQL - advanced

1

Kilka razy juz pomagalem na 4p jesli chodzi o zapytania ale mam problemik

Table TESTY
nrtestu integer
prowadzacy integer
semestr integer
tytul string
losowanych integer

Table PYTANIA
nrtestu integer
nrpytania integer
poprawna_odp string
tresc integer

Table WYNIKI
osoba foreign key osoby_id
nrtestu integer
nrpytania integer
zaznaczona_odp integer

Test moze miec 100pytan. Kolumna 'losowanych' zawiera liczbe pytan do wylosowania osobie.
Potrzebuje okreslic % poprawnego wypelnienia testu dla kazdej z osob i wypisac w postaci tabeli:

osoba, nrtestu,tytul testu, %poprawnego wypelnienia

dodam ze poprawne wypelnienie zachodzi gdy pytania.poprawna_odp=wyniki.zaznaczona_odp

natomiast pelna liczbe pytan przechowuje kolumna testy.losowanych

nie potrafie zlaczyc tego w jeden wynik...

POMOCY! ;(

0

SELECT
wyniki.osoba, testy.nrtestu, testy.tytul, count()/testy.losowanych100 as procent_porawnych
FROM
wyniki
INNER JOIN
pytania ON pytania.nrpytania = wynik.nrpytania
INNER JOIN
testy ON testy.nrtestu = wynik.nrtestu
WHERE
pytania.poprawna_odp=wyniki.zaznaczona_odp
GROUP BY wyniki.osoba, testy.nrtestu, testy.tytul

Nie mam czasu tego sprawdzić ale cos w ten deseń bym prubował ten warunek budzi wątpliwości :
pytania.poprawna_odp=wyniki.zaznaczona_odp ponieważ kolumny są różnego typu,
Należy upewnić się że nie będzie dzielenia przez 0, no i sprawdzić poprawność JOIN-ow
Mam nadzieje że pomoglem...

0

Na smierc zapomnialem o inner join
Dzieki [browar] , dziala.

0

Znow prosba o pomoc...

Tabela WYNIKI przeszla male ALTER aby moc miescic wyniki testow ktore ktos oblal..

Table WYNIKI
osoba foreign key osoby_id
nrtestu integer
nrpytania integer
zaznaczona_odp integer
podejscie integer

No i pytanie jak teraz wyswietlic % poprawnego wypelnienia testu dla kazdej z osob (+nr podejscia) i wypisac w postaci tabeli:

osoba, nrtestu,tytul testu, %poprawnego wypelnienia, podejscie

Podany przez Panczo kod dziala i wyswietlaja sie osobo linijki jednej osoby z podejscia 1 i tej samej osoby z podejscia 2.
Problem powstaje w warunku zaznaczona=poprawna...
Jesli za pierwszym podejsciem ktos nie wypelnil ani jednego pytania dobrze, linia z jego wynikiem rownym 0% sie nie pokaze.

i Co teraz??

Prosze o pomoooc ;(

0

to moze wykonaj sobie wyswietlenie tego co mozesz, a potem dopisz do listy
wynik kolejnego zapytania: zapytania zwracajacego pozycje gdzie wszystkie pytania byly bledne :/

0

To chyba troche pod gorke... Nie da sie latwiej?

0

ee ja sie na tym nie znam ;P , ale zaczekaj na Panczo to moze jeszcze raz ci ort! :d

0

Novitius nie wiem jakiej bazy używasz, podejrzewam, że MySQL-a, ja takiej nie posiadam i testowalem na MsSQL i to co mi sie udało wypłodzić:

SELECT
  wyniki.osoba, 
  testy.nrtestu, 
  testy.tytul, 
  SUM(CASE pytania.poprawna_odp WHEN wyniki.zaznaczona_odp THEN 1 ELSE 0 END)/testy.losowanych*100  AS procent_porawnych,
  wyniki.podejscie
FROM
  wyniki 
INNER JOIN 
  pytania ON pytania.nrpytania = wyniki.nrpytania and wyniki.nrtestu = pytania.nrtestu
INNER JOIN 
  testy ON testy.nrtestu = wyniki.nrtestu
GROUP BY 
  wyniki.osoba, testy.nrtestu, testy.tytul,wyniki.podejscie,testy.losowanych
ORDER BY 
   osoba, tytul, podejscie

To wyrażenie:

CASE pytania.poprawna_odp WHEN wyniki.zaznaczona_odp THEN 1 ELSE 0

Sprawdza warunek czy jest dobra odpowiedź, jesli tak to da 1 jeśli nie to 0 i teraz przy grupowaniu wyników ilość dobrych odpowiedzi jest po prostu sumą z tego wyrażenia, dzieki temu dla wszystkich zlych zwróci 0 i wynik będziesz miał taki jaki chcesz...

Nie znalazlem instrukcji CASE WHEN w MySQL-u to chyba specyfika samego T-SQL-a, ale wybadaj to:

http://dev.mysql.com/doc/mysql/en/if-statement.html

Ten link u góry to nie najlepszy, znalazlem jeszcze to:

http://dev.mysql.com/doc/mysql/en/control-flow-functions.html

Mam nadzieje, że pomogłem

0

Dziekuje za wskazowke.

Korzystam z Opensource InterBase 6.0.
Zaraz sprawdze czy da sie tak zrobic i napisze.

Pozdrawiam

Podobno InterBase nie obsluguje CASE..
Znalazlem cos takiego...
http://groups.google.pl/groups?hl=pl&lr=&threadm=3c3574d8%241_2%40dnews&rnum=22&prev=/groups%3Fq%3Dinterbase%2Bcase%26start%3D20%26hl%3Dpl%26lr%3D%26selm%3D3c3574d8%25241_2%2540dnews%26rnum%3D22...


Dopisane :

A moze wiecie jak w tym jednym zapytaniu pobrac wszystkie odpowiedzi danej osoby dla jednego testu z kazdego podejscia a w kolumnie obok tylko te prawidlowe... :>
Jak otrzymalbym taki wynik, tez sobie poradze..

0

Navitus twoja baza obsługuje podzapytania więc sprawdż czy przejdzie coś takiego:

SELECT * 
FROM
(
SELECT
  wyniki.osoba,
  testy.nrtestu,
  testy.tytul,
  1  as poprawna,
  wyniki.podejscie
FROM
  wyniki
INNER JOIN
  pytania ON pytania.nrpytania = wyniki.nrpytania and wyniki.nrtestu = pytania.nrtestu
INNER JOIN
  testy ON testy.nrtestu = wyniki.nrtestu
WHERE 
  pytania.poprawna_odp = wyniki.zaznaczona_odp
UNION ALL
SELECT
  wyniki.osoba,
  testy.nrtestu,
  testy.tytul,
  0  as poprawna,
  wyniki.podejscie
FROM
  wyniki
INNER JOIN
  pytania ON pytania.nrpytania = wyniki.nrpytania and wyniki.nrtestu = pytania.nrtestu
INNER JOIN
  testy ON testy.nrtestu = wyniki.nrtestu
WHERE 
  pytania.poprawna_odp <> wyniki.zaznaczona_odp
) AS tbelawynikow

Jeśli tak to przejdzie to możesz spokojnie pogrupować, a na pewno to przejdzie tylko poczytaj o procedurach (Stored Procedure) w tym to dam sobie głowę uciąć że się da...

0

Troszke musialem zmodyfikowac ten Twoj kod, ale rzeczywiscie dzieki podzapytaniom sprawa wydala sie prostsza.

Dziala tak jak bym sobie tego zyczyl.
Serdeczne podziekowania dla wszystkich a w szczegolnosci dla Panczo

Temat uwazam za wyjasniony i zamkniety.


Novitius

1 użytkowników online, w tym zalogowanych: 0, gości: 1