Forum » Programiranje » SQL problem
SQL problem
bigbada ::
imam tabelo TIPPREISKAVE
ID_TIPPREISKAVE INTEGER NOT NULL
REM ,IME_PREISKAVE VARCHAR2(20) NOT NULL
REM ,CENA NUMBER(5,3) NOT NULL
REM ,OPOMBE VARCHAR2(20) NOT NULL
in imam not pač nekaj tipov preiskav , ter za vsakega ceno..
recimo ultrazvok 30
rentgen 20
blabla 40
kak bi zdaj naredil sql povprasevanje da mi vrne povprecno vrednost?
torej da sesteje vse te cene pa deli s stevilom preiskav?
ID_TIPPREISKAVE INTEGER NOT NULL
REM ,IME_PREISKAVE VARCHAR2(20) NOT NULL
REM ,CENA NUMBER(5,3) NOT NULL
REM ,OPOMBE VARCHAR2(20) NOT NULL
in imam not pač nekaj tipov preiskav , ter za vsakega ceno..
recimo ultrazvok 30
rentgen 20
blabla 40
kak bi zdaj naredil sql povprasevanje da mi vrne povprecno vrednost?
torej da sesteje vse te cene pa deli s stevilom preiskav?
bigbada ::
aha...
kaj pa recimo tu:
INSERT INTO TIPI_PREISKAV VALUES (111, 'Ultrazvok srca', '33,00', 'pregled srca');
INSERT INTO TIPI_PREISKAV VALUES (222, 'Sistematski pregled', '15,00', 'vsesplosni pregled');
(ID_TIPPREISKAVE INTEGER NOT NULL
REM ,IME_PREISKAVE VARCHAR2(20) NOT NULL
REM ,CENA NUMBER(5,3) NOT NULL
REM ,OPOMBE VARCHAR2(20) NOT NULL
potem pa
INSERT INTO PREISKAVE VALUES (60, '5.1.2010', 111, '10233045762', '018119895203');
INSERT INTO PREISKAVE VALUES (61, '6.2.2010', 111, '30394729123', '023049577505');
INSERT INTO PREISKAVE VALUES (62, '15.1.2010',111, '50505123212', '018119895203');
INSERT INTO PREISKAVE VALUES (63, '30.5.2010', 111, '50123400029', '321747727271');
INSERT INTO PREISKAVE VALUES (64, '30.8.2010', 111, '00129983645', '101334562398');
INSERT INTO PREISKAVE VALUES (65, '12.1.2010', 222, '66621400023', '018119895203');
INSERT INTO PREISKAVE VALUES (66, '31.7.2010', 444, '10987773213', '018119895203');
INSERT INTO PREISKAVE VALUES (67, '15.8.2010', 555, '27368823641', '101334562398');
(ID_PREISKAVE INTEGER NOT NULL
REM ,DATUM DATE NOT NULL
REM ,TP_ID_TIPPREISKAVE INTEGER NOT NULL FK
REM ,OSE_EMSO VARCHAR2(20) NOT NULL FK
REM ,ZDR_EMSO VARCHAR2(20) NOT NULL FK
rad bi pa izvedel koliko pregledov "ultrazvok srca" je bilo izvedenih med 1.1.2010 in 30.6.2010?
bili so 4je ( ker 4 sifre 1111 ustrezajo tistim datumom)..
kaj pa recimo tu:
INSERT INTO TIPI_PREISKAV VALUES (111, 'Ultrazvok srca', '33,00', 'pregled srca');
INSERT INTO TIPI_PREISKAV VALUES (222, 'Sistematski pregled', '15,00', 'vsesplosni pregled');
(ID_TIPPREISKAVE INTEGER NOT NULL
REM ,IME_PREISKAVE VARCHAR2(20) NOT NULL
REM ,CENA NUMBER(5,3) NOT NULL
REM ,OPOMBE VARCHAR2(20) NOT NULL
potem pa
INSERT INTO PREISKAVE VALUES (60, '5.1.2010', 111, '10233045762', '018119895203');
INSERT INTO PREISKAVE VALUES (61, '6.2.2010', 111, '30394729123', '023049577505');
INSERT INTO PREISKAVE VALUES (62, '15.1.2010',111, '50505123212', '018119895203');
INSERT INTO PREISKAVE VALUES (63, '30.5.2010', 111, '50123400029', '321747727271');
INSERT INTO PREISKAVE VALUES (64, '30.8.2010', 111, '00129983645', '101334562398');
INSERT INTO PREISKAVE VALUES (65, '12.1.2010', 222, '66621400023', '018119895203');
INSERT INTO PREISKAVE VALUES (66, '31.7.2010', 444, '10987773213', '018119895203');
INSERT INTO PREISKAVE VALUES (67, '15.8.2010', 555, '27368823641', '101334562398');
(ID_PREISKAVE INTEGER NOT NULL
REM ,DATUM DATE NOT NULL
REM ,TP_ID_TIPPREISKAVE INTEGER NOT NULL FK
REM ,OSE_EMSO VARCHAR2(20) NOT NULL FK
REM ,ZDR_EMSO VARCHAR2(20) NOT NULL FK
rad bi pa izvedel koliko pregledov "ultrazvok srca" je bilo izvedenih med 1.1.2010 in 30.6.2010?
bili so 4je ( ker 4 sifre 1111 ustrezajo tistim datumom)..
JanezH ::
select count(*) from TIPI_PREISKAV tp, PREISKAVE p where p.TP_ID_TIPPREISKAVE = tp.ID_TIPPREISKAVE and tp.ID_TIPPREISKAVE = 111 and p.DATUM > '1.1.2010' and p.DATUM <= '30.6.2010' ;
alexa-lol ::
WarpedGone je izjavil:
smukec, oracle?
SQL by ISO ?
ta ukaz je tok trivialen da je pomoje v vseh dialektih enak
WarpedGone ::
Neki je standard neki druzga pa praksa. Že to, da ne teži z INNER JOIN je ene sorte "dead giveaway".
Zanimalo bi me samo zakaj BETWEEN ni dost dober. Pač upošteva tut zapise na začetni datum, tako kot upošteva tiste na končni datum. Pa z implicitno pretvorbo iz stringa v date tut nism happy. Pod predpostavko da datume hrani kot datum in ne kot string (insert je sumljiv). Če je shranjeno kot string, pol je pa where sploh narobe. You gotta love SQL :)
Zanimalo bi me samo zakaj BETWEEN ni dost dober. Pač upošteva tut zapise na začetni datum, tako kot upošteva tiste na končni datum. Pa z implicitno pretvorbo iz stringa v date tut nism happy. Pod predpostavko da datume hrani kot datum in ne kot string (insert je sumljiv). Če je shranjeno kot string, pol je pa where sploh narobe. You gotta love SQL :)
Zbogom in hvala za vse ribe
JanezH ::
Zadovoljen?
Oracle ja in deluje seveda tudi brez pretvorbe stringa v datum.
Between ne uporabljam zaradi prijaznosti do drugih, ki berejo kodo za teboj.
select count(*) from TIPI_PREISKAV tp, PREISKAVE p where p.TP_ID_TIPPREISKAVE = tp.ID_TIPPREISKAVE and tp.ID_TIPPREISKAVE = 111 and p.DATUM > to_date('1.1.2010', 'dd.mm.yyyy') and p.DATUM <= to_date('30.6.2010', 'dd.mm.yyyy') ;
Oracle ja in deluje seveda tudi brez pretvorbe stringa v datum.
Between ne uporabljam zaradi prijaznosti do drugih, ki berejo kodo za teboj.
WarpedGone ::
Sej implicitna pretvorba deluje, razen kadar ne. Na vsake kvatre dobiš (v PL/SQL-u) "internal buffer to small" al neki na to temo. Točne ORA cifre trenutno nimam v glavi, ker smo popucal vse implicitne pretvorbe, tko da že neki časa tega nism vidu :)
Zbogom in hvala za vse ribe
JanezH ::
Ja saj pri nas tud :) Vem, da smo v nekih starih procedurah na oracle 8 še imeli take pretvorbe in si res včasih dobil napako - se je pol popucalo sproti take stvari :) V 10-tki ali 11-tki se mi pa mislim, da še ni zgodilo, da ne bi delalo, če včasih na hitrico spišeš kak sql in se ti ne da dodajat pretvorb...
bigbada ::
Imam še en problem..
Koliko postelj je prostih na oddelku "Interna" ?
To imam tabelo POSTELJE
sifra 100 je Interna, 101 -Splosni oddelek itd..
INSERT INTO POSTELJE VALUES (10, 100);
INSERT INTO POSTELJE VALUES (11, 100);
INSERT INTO POSTELJE VALUES (12, 100);
INSERT INTO POSTELJE VALUES (13, 100);
INSERT INTO POSTELJE VALUES (14, 100);
INSERT INTO POSTELJE VALUES (15, 100);
INSERT INTO POSTELJE VALUES (16, 100);
INSERT INTO POSTELJE VALUES (17, 100);
INSERT INTO POSTELJE VALUES (18, 100);
INSERT INTO POSTELJE VALUES (20, 101);
INSERT INTO POSTELJE VALUES (21, 101);
INSERT INTO POSTELJE VALUES (22, 101);
INSERT INTO POSTELJE VALUES (23, 101);
INSERT INTO POSTELJE VALUES (24, 101);
INSERT INTO POSTELJE VALUES (30, 103);
INSERT INTO POSTELJE VALUES (31, 103);
CREATE TABLE POSTELJE
(ID_POSTELJE INTEGER NOT NULL
REM ,ODD_SIFRA_ODDELKA INTEGER NOT NULL
-----------------------------------------------------------------------------
To pa PACIENTI_POSTELJE
INSERT INTO PACIENTI_POSTELJE VALUES (41, '10.1.2010', '15.1.2010', 10, '10233045762');
INSERT INTO PACIENTI_POSTELJE VALUES (42, '12.1.2010', '16.1.2010', 11, '30394729123');
INSERT INTO PACIENTI_POSTELJE VALUES (43, '17.1.2010', '21.1.2010', 13, '50505123212');
INSERT INTO PACIENTI_POSTELJE VALUES (44, '14.1.2010', '22.1.2010', 14, '50123400029');
INSERT INTO PACIENTI_POSTELJE VALUES (45, '19.1.2010', '23.1.2010', 15, '00129983645');
INSERT INTO PACIENTI_POSTELJE VALUES (46, '10.1.2010', '20.1.2010', 16, '66621400023');
INSERT INTO PACIENTI_POSTELJE VALUES (47, '10.1.2010', '23.1.2010', 20, '10987773213');
INSERT INTO PACIENTI_POSTELJE VALUES (48, '20.2.2010', '26.2.2010', 21, '27368823641');
INSERT INTO PACIENTI_POSTELJE VALUES (49, '21.2.2010', '3.3.2010', 30, '00235023012');
INSERT INTO PACIENTI_POSTELJE VALUES (50, '27.2.2010', '8.3.2010', 31, '09909987611');
INSERT INTO PACIENTI_POSTELJE VALUES (51, '27.5.2010', '8.6.2010', 24, '42131500832');
CREATE TABLE PACIENTI_POSTELJE
(ID INTEGER NOT NULL
REM ,DATUM_ZACETKA DATE NOT NULL
REM ,DATUM_KONCA DATE NOT NULL
REM ,POS_ID_POSTELJE INTEGER NOT NULL
REM ,OSE_EMSO VARCHAR2(20) NOT NULL
Zdaj bi rad da mi izpise pač 3 ane.. Ker tam pod postelje imam nafilanih 9, ki so v oddelku Interna(to je šifra 100).. Potem v pacienti postelje pa imam pač pacienti ter dodeljene postelje.. Tistih številk ki ni v tabeli, so pač prazne ane..
10,11,12,13,14,15,16,17,18 - 9 postelj v Interna ..tabela POSTELJE
10,11,13,14,15,16-6 postelj ki so zasedene s pacienti.. tabela PACIENTI POSTELJE
torej 12,17,18 so proste ane.. to so 3
Zdaj pa nevem kako bi to naredil najlazje..
sem se mucil nekaj s counti pa sem povezal pol tabeli med sabo sam pol mi skos ven vrze kao 6.. tiste ki so skupne.. nemorem pa nikakor prit do onih ki so v eni pa niso v drugi :)
hvala za pomoč
LP
Koliko postelj je prostih na oddelku "Interna" ?
To imam tabelo POSTELJE
sifra 100 je Interna, 101 -Splosni oddelek itd..
INSERT INTO POSTELJE VALUES (10, 100);
INSERT INTO POSTELJE VALUES (11, 100);
INSERT INTO POSTELJE VALUES (12, 100);
INSERT INTO POSTELJE VALUES (13, 100);
INSERT INTO POSTELJE VALUES (14, 100);
INSERT INTO POSTELJE VALUES (15, 100);
INSERT INTO POSTELJE VALUES (16, 100);
INSERT INTO POSTELJE VALUES (17, 100);
INSERT INTO POSTELJE VALUES (18, 100);
INSERT INTO POSTELJE VALUES (20, 101);
INSERT INTO POSTELJE VALUES (21, 101);
INSERT INTO POSTELJE VALUES (22, 101);
INSERT INTO POSTELJE VALUES (23, 101);
INSERT INTO POSTELJE VALUES (24, 101);
INSERT INTO POSTELJE VALUES (30, 103);
INSERT INTO POSTELJE VALUES (31, 103);
CREATE TABLE POSTELJE
(ID_POSTELJE INTEGER NOT NULL
REM ,ODD_SIFRA_ODDELKA INTEGER NOT NULL
-----------------------------------------------------------------------------
To pa PACIENTI_POSTELJE
INSERT INTO PACIENTI_POSTELJE VALUES (41, '10.1.2010', '15.1.2010', 10, '10233045762');
INSERT INTO PACIENTI_POSTELJE VALUES (42, '12.1.2010', '16.1.2010', 11, '30394729123');
INSERT INTO PACIENTI_POSTELJE VALUES (43, '17.1.2010', '21.1.2010', 13, '50505123212');
INSERT INTO PACIENTI_POSTELJE VALUES (44, '14.1.2010', '22.1.2010', 14, '50123400029');
INSERT INTO PACIENTI_POSTELJE VALUES (45, '19.1.2010', '23.1.2010', 15, '00129983645');
INSERT INTO PACIENTI_POSTELJE VALUES (46, '10.1.2010', '20.1.2010', 16, '66621400023');
INSERT INTO PACIENTI_POSTELJE VALUES (47, '10.1.2010', '23.1.2010', 20, '10987773213');
INSERT INTO PACIENTI_POSTELJE VALUES (48, '20.2.2010', '26.2.2010', 21, '27368823641');
INSERT INTO PACIENTI_POSTELJE VALUES (49, '21.2.2010', '3.3.2010', 30, '00235023012');
INSERT INTO PACIENTI_POSTELJE VALUES (50, '27.2.2010', '8.3.2010', 31, '09909987611');
INSERT INTO PACIENTI_POSTELJE VALUES (51, '27.5.2010', '8.6.2010', 24, '42131500832');
CREATE TABLE PACIENTI_POSTELJE
(ID INTEGER NOT NULL
REM ,DATUM_ZACETKA DATE NOT NULL
REM ,DATUM_KONCA DATE NOT NULL
REM ,POS_ID_POSTELJE INTEGER NOT NULL
REM ,OSE_EMSO VARCHAR2(20) NOT NULL
Zdaj bi rad da mi izpise pač 3 ane.. Ker tam pod postelje imam nafilanih 9, ki so v oddelku Interna(to je šifra 100).. Potem v pacienti postelje pa imam pač pacienti ter dodeljene postelje.. Tistih številk ki ni v tabeli, so pač prazne ane..
10,11,12,13,14,15,16,17,18 - 9 postelj v Interna ..tabela POSTELJE
10,11,13,14,15,16-6 postelj ki so zasedene s pacienti.. tabela PACIENTI POSTELJE
torej 12,17,18 so proste ane.. to so 3
Zdaj pa nevem kako bi to naredil najlazje..
sem se mucil nekaj s counti pa sem povezal pol tabeli med sabo sam pol mi skos ven vrze kao 6.. tiste ki so skupne.. nemorem pa nikakor prit do onih ki so v eni pa niso v drugi :)
hvala za pomoč
LP
JanezH ::
select count(*) from POSTELJE p where p.ODD_SIFRA_ODDELKA = 100 and p.ID_POSTELJE not in ( select p.ID_POSTELJE from PACIENTI_POSTELJE pp, POSTELJE p where pp.POS_ID_POSTELJE = p.ID_POSTELJE and p.ODD_SIFRA_ODDELKA = 100 ) ;
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | oracle 12 identity (the old way)Oddelek: Programiranje | 1046 (851) | detroit |
» | PostgreSQL pomočOddelek: Programiranje | 2486 (1979) | Mato989 |
» | SQL Parent key not foundOddelek: Programiranje | 1047 (970) | Ciklamen |
» | SQL težavaOddelek: Programiranje | 5053 (4335) | joseti |
» | SQL trigger OracleOddelek: Programiranje | 1160 (1068) | PunXXX |