» »

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

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;

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

trnvpeti ::

top 1 pri oracle? katera verzija pa?

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

trnvpeti ::

select * from
(
select ki ga je napisal joze
)
where rownum=1

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.

PunXXX ::

Hvala vsem še posebej dmok-u, tole s pogledi je pravo zame :)
Hvala še 1x :)

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

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

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

keworkian ::

select *
from tabela
where stevilka LIKE '0%'
Obscenities in B-Flat

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

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
l'jga


Vredno ogleda ...

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

SQL vprasanje (strani: 1 2 )

Oddelek: Programiranje
688402 (5081) BivšiUser2
»

PostgreSQL pomoč

Oddelek: Programiranje
162522 (2015) Mato989
»

postgreSQL pomoč

Oddelek: Programiranje
132054 (1389) klemenSLO
»

SQL trigger Oracle

Oddelek: Programiranje
51185 (1093) PunXXX
»

SQL problem

Oddelek: Programiranje
111356 (1203) JanezH

Več podobnih tem