» »

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?

JanezH ::

select avg(cena) from TIPPREISKAVE;

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)..

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'
;

WarpedGone ::

smukec, oracle?
Zbogom in hvala za vse ribe

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 :)
Zbogom in hvala za vse ribe

JanezH ::

Zadovoljen?

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

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

oracle 12 identity (the old way)

Oddelek: Programiranje
6990 (795) detroit
»

PostgreSQL pomoč

Oddelek: Programiranje
162370 (1863) Mato989
»

SQL Parent key not found

Oddelek: Programiranje
7977 (900) Ciklamen
»

SQL težava

Oddelek: Programiranje
364581 (3863) joseti
»

SQL trigger Oracle

Oddelek: Programiranje
51109 (1017) PunXXX

Več podobnih tem