Wyrywkowe wyświetlanie wyniku zapytania-PostreSQL

0

Cześć,
Mam pytanie, dopiero zaczynam przygodę z SQL i może ktoś będzie w stanie mi pomóc a niestety nie znalazłem odpowiedzi w innych wątkach. Chciałbym zrobić następującą rzecz:
1.Mam tabele z kilkunastoma kolumnami
2.W kolumnie o nazwie indeks mam ID
3.W kolumnie o nazwie wynik mam 10 rodzajów wyników (do każdego ID przypisany jakiś wynik) a dokładnie a,b,c,d,e,f,g,h,i,j
Chciałbym zrobić takie zapytanie które po wpisaniu danego ID wyrzucałoby tylko rekord z dwoma kolumnami: ID i wynik (inne tabele nie były pokazywane). Jednak nie chcę by w tabeli wynik był pokazywany dokładny wynik a tylko jeden z 3 zbiorów. Zbiór A to wyniki abc, B:def, C:ghij.
Czyli Chodzi o to by po wpisaniu ID który ma wynik f zapytanie zwracało wynik:
Tylko dwie kolumny, w pierwszej ID a w drugiej tylko nazwa zbioru czyli w tym wypadku B.

Czy będzie możliwe napisanie takiego zapytania? Czy ktoś jest w stanie z tym pomóc? Będę bardzo wdzięczny.

0

Mimo chęci nie rozumiem co chcesz osiągnąć, może tak napisz jakie masz tabele, z kolumnami i co chcesz z nich wyciągnąć

0
Panczo napisał(a):

Mimo chęci nie rozumiem co chcesz osiągnąć, może tak napisz jakie masz tabele, z kolumnami i co chcesz z nich wyciągnąć

Tak myślałem, że może nie do końca jasno wyjaśniłem, a teraz? :)
Mam taką tabele(załącznik).

Chciałbym po wpisaniu zapytania i danego ID (np.13) otrzymać wynik:
ID wynik
13 A
Dlatego, że c należy do zbioru A, gdybym szukał wyniku dla ID 17 chciałbym otrzymać zbiór C w wyniku ponieważ ID 13 należy do zbioru C.

1

No to prosty select:

select id, wynik from tabela where id=13
1
with zbiory(wynik, zbior) as
(values('a', 'A'), ('b','A'), ('c', 'A'), ('d','B'),('e','B'),('f','B'), ('g','C'),('h','C'),('i','C'),('j','C'))
select t.id, z.zbior from tabela t join zbiory z on z.wynik=t.wynik
where t.id=13
0

Panowie, o to chodziło! Już testuje kolejne rzeczy! Dzięki raz jeszcze!

0
Marcin.Miga napisał(a):
with zbiory(wynik, zbior) as
(values('a', 'A'), ('b','A'), ('c', 'A'), ('d','B'),('e','B'),('f','B'), ('g','C'),('h','C'),('i','C'),('j','C'))
select t.id, z.zbior from tabela t join zbiory z on z.wynik=t.wynik
where t.id=13

Marcin, chyba jednak nie do końca ogarniam. Możesz jakoś łopatologicznie wyjaśnić?
zbiory(wynik, zbior)-to muszę zdefiniować nową tabelę?

0

@Runon: Możesz, ale nie musisz - tak jak jest też zadziała. Zależy, jak często (w ilu miejscach) będziesz używać tego zapytania. Jeśli w kilku(nastu), to lepiej stgwórz tabelą -= łatwiej się wtedy pisze i jest logiczniej.

0

Wyrzuca mi błąd przy with zbiory(wynik, zbior) :(

0

Verison 1.20.0

0

Tak, PostgreSQL 9.1.2. Wybacz.

0
Marcin.Miga napisał(a):

Musi pójść
http://sqlfiddle.com/#!15/6d0ed/2

Marcin, widzę, że jest OK, gorzej z moją wiedzą... Czy możesz mi wyjaśnić co tutaj robię źle? http://sqlfiddle.com/#!9/2db673/4 ?
Głównie chodzi mi o to skąd się bierze i po co się to robi np. t.ID, z.zbior, tabeleczka t, z.wynik=t.wynik, t.ID=1; tz. po co się daje litere t. z. przez ID zbór itd oraz literę t po nazwie tabeli?

1

Miałeś wybrany jako serwer MySQL, a on z tego coi wiem WITH nie obsługuje.
Przerobione na postgreSQL: http://sqlfiddle.com/#!15/d4303/1

0

Fakt, dzięki Marcin jeszcze raz!

0
Marcin.Miga napisał(a):

Miałeś wybrany jako serwer MySQL, a on z tego coi wiem WITH nie obsługuje.
Przerobione na postgreSQL: http://sqlfiddle.com/#!15/d4303/1

Marcin, zapytanie śmiga, mam jednak pytanie, wiesz może jak zrobić by zapytanie zwracało zamiast:
(VALUES('a', 'A'), ('b','A'), ('c', 'A'), ('d','B'),('e','B'),('f','B'), ('g','C'),('h','C'),('i','C'),('j','C'))
to dla wartości a b c wynik A, dla d e f wynik B a dla każdego innego wynik C? W obecnej formie gdy dodaje więcej wierszy to muszę sprawdzać czy każdy ma przyporządkowany wynik a przy większej ilości to trudne :/

0

case when cos IN ('a', 'b', 'c') then 'A' when cos IN ('d', 'e', 'f') then 'B' else 'C' end

0
Marcin.Miga napisał(a):

case when cos IN ('a', 'b', 'c') then 'A' when cos IN ('d', 'e', 'f') then 'B' else 'C' end

Dużo pracy przede mną. Co mi tu nie gra? :( http://sqlfiddle.com/#!15/d4303/17

0

A tak by wyrzucało tylko jeden wiersz gdy np wybiorę where ID =1 oraz z wynikiem czyli kolumna ID i zbiór a bez wynik?
Czyli coś takiego: http://sqlfiddle.com/#!15/d4303/35 ale bez kolumny wynik.

0
Runon napisał(a):

A tak by wyrzucało tylko jeden wiersz gdy np wybiorę where ID =1 oraz z wynikiem czyli kolumna ID i zbiór a bez wynik?
Czyli coś takiego: http://sqlfiddle.com/#!15/d4303/35 ale bez kolumny wynik.
No tak, dzięki i tak za pomoc.

0

Zrobione, dzięki jeszcze raz

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