» »

SQL poizvedba

SQL poizvedba

xsenon ::

pozdravljeni,

želim narediti avtomatsko generiranje telefonskega cenika. Vse cene za posamezno destinacijo imam vpisane v bazi, vendar pa mi oblika zapisa v bazi ne ustreza glede na željeno obliko telefonskega imenika. ZA lažje razumevanje kaj želim narediti sem prilepil sliko. Sem že poskušal zadevo narediti z dvojno pizvedbo in zapisom v novo tabelo vendar se mi to ne zdi najbolj smotrno. Kot prvo me zanima ali je takšna poizvedba kot je predvidena na spodnji sliki sploh mogoča, in če je bi prosil za pomoč ali vsaj namig v pravo smer.

LP

zgornja tabel na sliki je situacija v bazi, spodnaj tabela je razultat poizvedbe, ki jo želim napisati.

 shema

shema

darkolord ::

Katero bazo uporabljaš?

xsenon ::

mysql

borchi ::

ghetto varjanta...

select distinct DESTINACIJA
, (select top 1 CENA from TABELA where DESTINACIJA = t1.DESTINACIJA and TIP = 'fiksni') as CENA_FIKSNI
, (select top 1 CENA from TABELA where DESTINACIJA = t1.DESTINACIJA and TIP = 'mobilni') as CENA_MOBILNI
from TABELA t1
l'jga

Zgodovina sprememb…

  • spremenil: borchi ()

fusioman ::

Lahko tud z group by

recimo: SELECT destinacija, cena, tip FROM ... GROUP BY destinacija, tip

xsenon ::

tnx za tale query, mislm da je tole zelo blizu rešitve a mi lahko poveš kaj pomeni "top 1" zaenkrat sem tale top 1 odstranil iz querija ker mi je javljal napako, po odstranitvi pa mi javi sledečo napako "Subquery returns more than 1 row".

Kako naj rešim zadvo?

LP

darkolord ::

na koncu subquerya daj LIMIT 1

TOP oz LIMIT omejita število vrnjenih vrstic

Zgodovina sprememb…

  • spremenilo: darkolord ()

borchi ::

ups, mysql.

namesto 'top 1' uporabiš 'limit 1'

mogoče takole:

select CENA
from TABELA
where DESTINACIJA = t1.DESTINACIJA and TIP = 'fiksni'
limit 1

ne vem točno kam natiščiš 'limit', nimam nobenega mysql pri roki
l'jga

xsenon ::

Takole zgleda moja poizvedba:

SELECT distinct destination,
(select sdRate from rating.cenik_sipura where destination = cenik_sipura.destination and connType = 'Fixed' ) as CENA_FIKSNI limit 1,
(select sdRate from rating.cenik_sipura where destination = cenik_sipura.destination and connType = 'Mobile') as CENA_MOBILNI limit 1
from rating.cenik_sipura

tole pa je napaka, ki jo javi ko poženem to poizvedbo


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(select sdRate from rating.cenik_sipura where destination = cenik_sipura.destina' at line 3

Ima kdo kakšno idejo?

borchi ::

'limit 1' znotraj subquery-ja (znotraj oklepajev)
l'jga

romci ::

Brez kaksnih subselectov ali joinov:

SELECT destinacija, SUM(CASE tip WHEN 'fiksni' THEN cena ELSE 0 END) AS cena_fiksni, SUM(CASE tip WHEN 'mobilni' THEN cena ELSE 0 END) AS cena_mobilni FROM cene GROUP BY destinacija

Oz. verzija z IF, ki je morda malo hitrejsa:
SELECT destinacija, SUM(IF (tip = 'fiksni', cena, 0)) AS cena_fiksni, SUM(IF(tip = 'mobilni', cena, 0)) AS cena_mobilni FROM cene GROUP BY destinacija
-- not all those who wander are lost...

Zgodovina sprememb…

  • spremenil: romci ()

borchi ::

ja, romci-jeva rešitev je še bolj 'ghetto' :D

(ni niti tolk generalna, da bi delala za vse tipe podatkov (vsaj 'max' uporabi namesto 'sum')...)
l'jga

xsenon ::

fantje vi ste zakon! Zadeva dela k ura, full vam hvala.

LP Peter

romci ::

V nekajletnem delu z SQLom sem moral ze veckrat row-e prikazat kot column-e a se nisem nasel bolj elegantnega stavka kot tole ghetto zadevco (en subselect za vsak column VS noben subselect? nobrainer).
Generalnost pa ni bla requirement tule, ce so v tabeli pac cene. Sestevanje je malenkost hitrejse od primerjav, ki jih rabi proc za izvedbo 'max', pri generalnosti se pa 'max'-u seveda, kot si rekel, ne mores izognit :)
-- not all those who wander are lost...

darkolord ::

se nisem nasel bolj elegantnega stavka kot tole ghetto zadevco
No ja, PIVOT je bolj eleganten. Samo pač v SQL Serverju.

borchi ::

se strinjam z obema.
l'jga

xsenon ::

Ojla,

sedaj sem ugotovil, da mi poizvedba sicer dela in mi vrne pravilno v kolonah zadeve, samo imam pa problem da mi v vseh fildih vrne iste cifre (vidno na sliki). uporabil sem sledečo poizvedbo:

SELECT distinct destination,(SELECT sdRate FROM rating.cenik_sipura WHERE destination = cenik_sipura.destination and connType = 'Fixed' limit 1) as CENA_FIKSNI,
(SELECT sdRate FROM rating.cenik_sipura WHERE destination = cenik_sipura.destination and connType = 'Mobile' limit 1) as CENA_MOBILNI
FROM rating.cenik_sipura

Ponavljajoči se števili nista prvi števili v tabeli.




Vredno ogleda ...

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

[SQL] Unikatni izpisi

Oddelek: Programiranje
212225 (1612) 111111111111
»

SQL poizvedba

Oddelek: Programiranje
163268 (2613) awy
»

[SQL] PgAdmin preprosto vprasanje povezano s stolpci v tabeli

Oddelek: Programiranje
222197 (1556) Cvele2011
»

sql select stavek

Oddelek: Programiranje
121465 (1367) zavajon
»

MYSQL vprašanje

Oddelek: Programiranje
131794 (1409) MrBrdo

Več podobnih tem