Forum » Programiranje » SQL poizvedba
SQL poizvedba
PunXXX ::
Pozdravljeni!
Imam sledeč problem.
Do sedaj sem uspel prešteti število članov glede na posamezno društvo.
Zanima me kako bi morala zgledati poizvedba tako, da bi mi vrnilo samo društvo z največjim
številom članov MAX(COUNT(ID_CLANA)) ne dela (torej je moj pristop napačen?). Baza je narejena v Oraclu.
Lepo prosim za kakršnokoli pomoč.
2. Katero društvo ima največ članov?
SELECT DRUSTVA.IME, COUNT(ID_CLANA)
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY DRUSTVA.IME
ORDER BY COUNT(ID_CLANA) DESC;
REM CREATE TABLE CLANI(
REM ID_CLANA INTEGER NOT NULL
REM IME VARCHAR2(30) NOT NULL
REM PRIIMEK VARCHAR2(50) NOT NULL
REM DATUM_ROJSTVA DATE NOT NULL
REM TELEFONSKA VARCHAR2(35) NOT NULL
REM EMAIL VARCHAR2(50) NOT NULL
REM SPOL VARCHAR2(1)
REM KRA_ID_KRAJA INTEGER NOT NULL
REM CREATE TABLE DRUSTVA(
REM ID_DRUSTVA INTEGER NOT NULL
REM IME VARCHAR2(70) NOT NULL
REM TELEFON VARCHAR2(40) NOT NULL
REM WWW VARCHAR2(50) NOT NULL
REM NASLOV VARCHAR2(70) NOT NULL
REM CREATE TABLE CLANI_DRUSTVA(
REM ID INTEGER NOT NULL
REM DATUM_OD DATE NOT NULL
REM DATUM_DO DATE NOT NULL
REM DRU_ID_DRUSTVA INTEGER
REM CLA_ID_CLANA INTEGER NOT NULL
Imam sledeč problem.
Do sedaj sem uspel prešteti število članov glede na posamezno društvo.
Zanima me kako bi morala zgledati poizvedba tako, da bi mi vrnilo samo društvo z največjim
številom članov MAX(COUNT(ID_CLANA)) ne dela (torej je moj pristop napačen?). Baza je narejena v Oraclu.
Lepo prosim za kakršnokoli pomoč.
2. Katero društvo ima največ članov?
SELECT DRUSTVA.IME, COUNT(ID_CLANA)
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY DRUSTVA.IME
ORDER BY COUNT(ID_CLANA) DESC;
REM CREATE TABLE CLANI(
REM ID_CLANA INTEGER NOT NULL
REM IME VARCHAR2(30) NOT NULL
REM PRIIMEK VARCHAR2(50) NOT NULL
REM DATUM_ROJSTVA DATE NOT NULL
REM TELEFONSKA VARCHAR2(35) NOT NULL
REM EMAIL VARCHAR2(50) NOT NULL
REM SPOL VARCHAR2(1)
REM KRA_ID_KRAJA INTEGER NOT NULL
REM CREATE TABLE DRUSTVA(
REM ID_DRUSTVA INTEGER NOT NULL
REM IME VARCHAR2(70) NOT NULL
REM TELEFON VARCHAR2(40) NOT NULL
REM WWW VARCHAR2(50) NOT NULL
REM NASLOV VARCHAR2(70) NOT NULL
REM CREATE TABLE CLANI_DRUSTVA(
REM ID INTEGER NOT NULL
REM DATUM_OD DATE NOT NULL
REM DATUM_DO DATE NOT NULL
REM DRU_ID_DRUSTVA INTEGER
REM CLA_ID_CLANA INTEGER NOT NULL
joze67 ::
SELECT top 1 DRUSTVA.IME, COUNT(ID_CLANA)
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY DRUSTVA.IME
ORDER BY COUNT(ID_CLANA) DESC;
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY DRUSTVA.IME
ORDER BY COUNT(ID_CLANA) DESC;
PunXXX ::
joze hvala za odgovor. Zanima me kaj bi bilo v takšnem primeru, če bi imel 3 društva z enakim številom članov (vsa 3 društva bi imela največ članov med vsemi društvi)?
joze67 ::
Ah, pa res; spregledal sem Oracle :-( mea culpa.
Sicer pa, če bi bila tri društva, bi top 1 še vedno vrnil eno. No, v MS SQL se tudi to reši bp; za Oracle pa ne vem.
Namreč, izraz
select max(count(cla_id_clana)) from drustva inner join clani_drustva on drustva.id_drustva=clani_drustva.dru_id_drustva group by drustva.id_drustva
bo vrnil max število članov po društvih (predpostavim, da hočeš grupirati po id in ne po imenu, ker ni nujno isto)
Potem
select DRUSTVA.ID_DRUSTVA, max(DRUSTVA.IME), COUNT(ID_CLANA)
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY DRUSTVA.ID_DRUSTVA
having count(id_clana) = (tisti select)
vrne imena vseh teh društev
Sicer pa, če bi bila tri društva, bi top 1 še vedno vrnil eno. No, v MS SQL se tudi to reši bp; za Oracle pa ne vem.
Namreč, izraz
select max(count(cla_id_clana)) from drustva inner join clani_drustva on drustva.id_drustva=clani_drustva.dru_id_drustva group by drustva.id_drustva
bo vrnil max število članov po društvih (predpostavim, da hočeš grupirati po id in ne po imenu, ker ni nujno isto)
Potem
select DRUSTVA.ID_DRUSTVA, max(DRUSTVA.IME), COUNT(ID_CLANA)
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY DRUSTVA.ID_DRUSTVA
having count(id_clana) = (tisti select)
vrne imena vseh teh društev
dmok ::
Jaz bi naredil VIEW društev s številom članov:
CREATE VIEW V_DRUSTVACLANI AS SELECT
DRUSTVA.ID_DRUSTVA,
COUNT(ID_CLANA) AS STEVILO_CLANOV
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE
DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY
DRUSTVA.ID_DRUSTVA
in potem prebral vsa društva z največjim številom članov s pomočjo:
SELECT
DRUSTVA.IME,
V_DRUSTVACLANI.STEVILO_CLANOV
FROM
V_DRUSTVACLANI
JOIN DRUSTVA ON DRUSTVA.ID_DRUSTVA = V_DRUSTVACLANI.ID_DRUSTVA
WHERE
V_DRUSTVACLANI.STEVILO_CLANOV = (SELECT MAX(STEVILO_CLANOV) FROM V_DRUSTVACLANI)
Lahko pa vse stlačiš skupaj v en SQL.
d.
CREATE VIEW V_DRUSTVACLANI AS SELECT
DRUSTVA.ID_DRUSTVA,
COUNT(ID_CLANA) AS STEVILO_CLANOV
FROM DRUSTVA, CLANI_DRUSTVA, CLANI
WHERE
DRUSTVA.ID_DRUSTVA = CLANI_DRUSTVA.DRU_ID_DRUSTVA
AND CLANI.ID_CLANA = CLANI_DRUSTVA.CLA_ID_CLANA
GROUP BY
DRUSTVA.ID_DRUSTVA
in potem prebral vsa društva z največjim številom članov s pomočjo:
SELECT
DRUSTVA.IME,
V_DRUSTVACLANI.STEVILO_CLANOV
FROM
V_DRUSTVACLANI
JOIN DRUSTVA ON DRUSTVA.ID_DRUSTVA = V_DRUSTVACLANI.ID_DRUSTVA
WHERE
V_DRUSTVACLANI.STEVILO_CLANOV = (SELECT MAX(STEVILO_CLANOV) FROM V_DRUSTVACLANI)
Lahko pa vse stlačiš skupaj v en SQL.
d.
dëych ::
Kako bi združil polje po IP_naslovu in skupaj seštel dve vrednosti St_Paketov...
|IP_Naslov|St_Paketov|Datum
-------------------------------
|1.1.1.1|100|2009-05-04
|1.1.1.2|200|2009-05-04
|1.1.1.1|300|2009-05-03
torej potem ko naredim SQL....FROM....WHERE 'datumOd' AND 'datumDo' skupaj združi iste IPje in sešteje vrednost polja St_Paketov? Da dobim vsoto glede na izbrano časovno/datumsko obdobje?
|IP_Naslov|St_Paketov
---------------------
|1.1.1.1|400
|1.1.1.2|200
|IP_Naslov|St_Paketov|Datum
-------------------------------
|1.1.1.1|100|2009-05-04
|1.1.1.2|200|2009-05-04
|1.1.1.1|300|2009-05-03
torej potem ko naredim SQL....FROM....WHERE 'datumOd' AND 'datumDo' skupaj združi iste IPje in sešteje vrednost polja St_Paketov? Da dobim vsoto glede na izbrano časovno/datumsko obdobje?
|IP_Naslov|St_Paketov
---------------------
|1.1.1.1|400
|1.1.1.2|200
borchi ::
tu ni nobene magije, uporabiš 'group by'...
select IP_Naslov, SUM(St_Paketov) St_Paketov
from BLA_BLA
where Datum between '2009-05-03' and '2009-05-04'
group by IP_Naslov
select IP_Naslov, SUM(St_Paketov) St_Paketov
from BLA_BLA
where Datum between '2009-05-03' and '2009-05-04'
group by IP_Naslov
l'jga
dëych ::
Ok, thnx. Tako zgleda nekak celotn query:
SELECT TOP 15 IP_naslov, SUM(St_Paketov) as SUM_St_Paketov
FROM BLA_BLA
WHERE Datum between '2009-05-03' and '2009-05-04'
GROUP BY IP_Naslov
ORDER BY SUM(St_Paketov) DESC;
Lp
SELECT TOP 15 IP_naslov, SUM(St_Paketov) as SUM_St_Paketov
FROM BLA_BLA
WHERE Datum between '2009-05-03' and '2009-05-04'
GROUP BY IP_Naslov
ORDER BY SUM(St_Paketov) DESC;
Lp
dëych ::
Kako lahko naredim SELECT med dvema stevilkama, ki ste zacneta z nulo: npr. med 0100 in 0700? Če polje pretvorim v int mi odreže vse nule spredaj, kar ni OK. Če naredim tak SELECT mi potegne vse ostale številke, ki jih ne potrbujem.
SELECT * FROM tabela WHERE stevilka BETWEEN '0100' AND '0700'..
SELECT * FROM tabela WHERE stevilka BETWEEN '0100' AND '0700'..
borchi ::
> Če polje pretvorim v int mi odreže vse nule spredaj, kar ni OK.
?! sej ni treba, da v result setu prikazuješ convertano v int. to samo v pogoju narediš...
?! sej ni treba, da v result setu prikazuješ convertano v int. to samo v pogoju narediš...
l'jga
dëych ::
EDIT: mi je uspelo z eno skripto: If IsNull(Polje1)...
Še eno vprasanje...Ena polja so prazna, vendar mi ne uspe, da bi ta polja zamenjal z nekim
tekstom...
UPDATE tabela SET Polje1 = 'Tekst'
WHERE LEN(Polje1)='null';
Kakšna je vrednost polja, če ni nobenga podatka v fieldu?
Če naredim SELECT LEN(Polje1) as Dolzina FROM Tabela mi pri tistih vrne prazno polje.
Še eno vprasanje...Ena polja so prazna, vendar mi ne uspe, da bi ta polja zamenjal z nekim
tekstom...
UPDATE tabela SET Polje1 = 'Tekst'
WHERE LEN(Polje1)='null';
Kakšna je vrednost polja, če ni nobenga podatka v fieldu?
Če naredim SELECT LEN(Polje1) as Dolzina FROM Tabela mi pri tistih vrne prazno polje.
Zgodovina sprememb…
- spremenil: dëych ()
borchi ::
> Kakšna je vrednost polja, če ni nobenga podatka v fieldu?
null.
ampak ne moreš rečt 'if TABELA.POLJE1 = null...' ampak 'if TABELA.POLJE1 is null...'
> Če naredim SELECT LEN(Polje1) as Dolzina FROM Tabela mi pri tistih vrne prazno polje.
vedno moraš na nullable kolonah predvidevat, da lahko imaš null 'vrednost' in ker neznani vrednosti ne moreš zmerit dolžine, moraš uporabit isnull(check_expression, replacement_value)...
select len(isnull(Polje1, '')) as Dolzina
from Tabela
null.
ampak ne moreš rečt 'if TABELA.POLJE1 = null...' ampak 'if TABELA.POLJE1 is null...'
> Če naredim SELECT LEN(Polje1) as Dolzina FROM Tabela mi pri tistih vrne prazno polje.
vedno moraš na nullable kolonah predvidevat, da lahko imaš null 'vrednost' in ker neznani vrednosti ne moreš zmerit dolžine, moraš uporabit isnull(check_expression, replacement_value)...
select len(isnull(Polje1, '')) as Dolzina
from Tabela
l'jga
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | SQL vprasanje (strani: 1 2 )Oddelek: Programiranje | 8402 (5081) | BivšiUser2 |
» | PostgreSQL pomočOddelek: Programiranje | 2522 (2015) | Mato989 |
» | postgreSQL pomočOddelek: Programiranje | 2054 (1389) | klemenSLO |
» | SQL trigger OracleOddelek: Programiranje | 1184 (1092) | PunXXX |
» | SQL problemOddelek: Programiranje | 1355 (1202) | JanezH |