» »

[SQL] Unikatni izpisi

[SQL] Unikatni izpisi

111111111111 ::

Lepo pozdravljeni.

Nekaj se igram z SQL stavki in sem naletel na problem imam sledečo tabelo imenovano testna.

 TAbela1

TAbela1



Prosim zavedajte se da nimam tabele v excelu ampak v MySql in bi rad naredil sledečo Querry poizvedbo.
Prvi stolpec vsebuje ID ki je unikaten za vsako uporabo templatea, vsak uporabnik lahko izbere poljubno število kartic za novo leto. S querryem bi rad iz tabele ven dobil rezultat katere unikatne template je uporabil vsak uporabnik. Npr. Pričakovan rezultat zgornje tabele je:

 Tabela2

Tabela2



DISTINCT sem že našel a ga ne znam uporabit v kontekstu. Hvala za vso pomoč.

čuhalev ::

tole bo kak GROUP BY template

MrStein ::

SELECT DISTINCT oseba, template FROM TABELA1;


To bo vrnilo številko osebe in ID template.
Če rabiš zraven še ostale stolpce, povej.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

111111111111 ::

MrStein je izjavil:


SELECT DISTINCT oseba, template FROM TABELA1;


To bo vrnilo številko osebe in ID template.
Če rabiš zraven še ostale stolpce, povej.


Hvala takoj, ko pridem domov bom testiral. Rabim pa stolpce oseba template in opis. Ali bo OK če preprosto napišem:
SELECT DISTINCT oseba, template, opis FROM TABELA1;

Zgodovina sprememb…

klemenSLO ::

Mislim da distinct dela na VSEH stolpcih ki jih navedeš. Če bo torej opis na templejtih iste osebe različen boš dobil 2 zapisa. za to osebo in ta template.
Life is not measured in minutes, but in MOMENTS...

MrStein ::

Ja, če ni garantirano, da je opis vedno enak za isti template, potem se ta logika "podere".

Če ne prej, se tu zaveš, zakaj je dobro imeti tabele v normalni obliki. ;)

Stolpec "opis" ti izgleda, da je odvisen od vrednosti stolpca "template", po pravilu pa naj bi bil odvisen le od primarnega ključa (ki ga tudi nimaš, razen če je to stolpec ID).
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!

Zgodovina sprememb…

  • spremenil: MrStein ()

111111111111 ::

Uff... Opis je vedno enak za isti template, se pa strinjam da ni normalna oblika. Vsaj to so pazili, da je res vedno identičen opis templata.

Tole moram res probat če deluje. Bom še potem imel cel kup vprašanj.

Spura ::

jst ti predlagam da selektiras samo 2 stolpca brez opisa in potem opis zraven s kodo prineses po ID templejta, kar ti garantira konsistentne opise.

Alternativno ce te boli kita:

SELECT DISTINCT OSEBA, TEMPLATE, MIN(OPIS) FROM TABELA1 GROUP BY OSEBA, TEMPLATE

Zgodovina sprememb…

  • spremenil: Spura ()

111111111111 ::

Tabelo bom razstavil na prafaktorje, ker je sestavljena iz 2 ali 3 queerjev, ki so bili že prej v sistemu. Sem šel malo na trotl ziher vrjanto. Drugače imata tamplate in opis svojo tabelo in ni panike da bi pri tamplate ID prišel kak drugačen opis.

Spura ::

Aja pol pa OK. Ce imas aplikacijo najprej zloadaj sifrant templateov, pol pa selektiri brez opisa in sam dodaj iz sifrantov vrednost opisa.

111111111111 ::

Sem uporabil DISTINCT na začetku in deluje kot urca. Hvala vsem za pomoč pridem še nazaj. :)

111111111111 ::

LEpo pozdravljeni spet. :)

Naletel sem na sledečo težavo, ki ji v querrju nisem kos.

Imam sledečo tabelo:

 TAbela1

TAbela1



Rad bi našel za katero kartico je bila dosežena najnižja cena.
Moj beden poskus:
SELECT MAX(id), DISTINCT (kartica), cena FROM TAbela1


Željeni rezultat:
 Tabela2

Tabela2

Zgodovina sprememb…

111111111111 ::

Sedaj sem se že dokopal do:
SELECT max(id), kartica
FROM TAbela1 GROUP BY kartica ;


Dobim pravilna prva dva stolpca.
Če naredim pa:
SELECT max(id), kartica, cena
FROM TAbela1 GROUP BY kartica ;


Dobim pa error. :( Any ideas?

Math Freak ::

Kaj pa ...

SELECT id, kartica, "cena(EUR)"
FROM TAbela1 GROUP BY kartica
ORDER BY id;

Zgodovina sprememb…

Math Freak ::

V glavnem, kolikor vidim nimaš stolpec cena ampak cena(€).

111111111111 ::

Cena sem napisal samo kot referenco, da dam stolpec. Imena polj so pravilna, samo javi mi napako v SQL-u.

You tried to execute a query taht does not include the specified expression 'id' as part of an aggregate function.

Zgodovina sprememb…

Math Freak ::

Eh, sqlite to požre brez problema =p.

Probi potem neki v tem smislu:

SELECT max(id), kartica, min(cena)
FROM Tabela1 GROUP BY kartica ;


To ti verjetno javlja napako, ker se id in cena ne pojavite v grupirnem stavku, in program ne ve katero vrednost vzeti.

Samo to ti pa ne bo pravilne id-je dal.

Zgodovina sprememb…

Math Freak ::

Lahko probaš nekaj takega: Napišeš poizvedbo za kartico in ceno in ji na koncu prilimaš še id. Drugo mi ne pade trenutno na pamet, pozno je že =p.

SELECT tab1.id,
              tab1.kartica,
              tab1.cena
FROM TAbela1 tab1,
            (SELECT tab2.kartica       k2,
                           min(tab2.cena) c2
             FROM   TAbela1 tab2
             GROUP BY tab2.kartica)
WHERE tab1.cena = c2
AND      tab1.kartica = k2
ORDER BY tab1.id ASC

111111111111 ::

Math Freak je izjavil:

Lahko probaš nekaj takega: Napišeš poizvedbo za kartico in ceno in ji na koncu prilimaš še id. Drugo mi ne pade trenutno na pamet, pozno je že =p.

SELECT tab1.id,
tab1.kartica,
tab1.cena
FROM TAbela1 tab1,
(SELECT tab2.kartica k2,
min(tab2.cena) c2
FROM TAbela1 tab2
GROUP BY tab2.kartica)
WHERE tab1.cena = c2
AND tab1.kartica = k2
ORDER BY tab1.id ASC


Hvala ti sem potem kar izvozil tabele v php in jih tam pomergal. :)

Imam pa že naslednje vprašanje:

tabela1

id|datum|stanje_kartic_na_dan|
1|30.12.2013|23
1|31.12.2013|25
1|1.1.2014|35
1|2.1.2014|12
2|30.12.2013|34
2|31.12.2013|65
2|1.1.2014|43

tabela2
id|datum|letna_kvota|
1|31.12.2013|100
1|31.12.2014|150
2|31.12.2013|200
2|31.12.2014|300

Željen rezultat:
tabela3
id|datum|stanje_kartic_na_dan|letna_kvota|
1|30.12.2013|23|100
1|31.12.2013|25|100
1|1.1.2014|35|150
1|2.1.2014|12|150
2|30.12.2013|34|200
2|31.12.2013|65|200
2|1.1.2014|43|300

Problem je ker se mi vsi JOIN stavki sem jih testiral in preganjal zalomijo? Ima kdo kakšno idejo?

Hvala v naprej za pomoč.

Math Freak ::

V SQLite-u bi šlo nekako tako:

SELECT tabela1.id 
,      tabela1.datum
,      tabela1.stanje_kartic_na_dan
,      tabela2.letna_kvota
FROM   tabela1 INNER JOIN
,      tabela2
ON     tabela1.id = tabela2.id 
AND    SUBSTR(tabela1.datum,7,4) =  SUBSTR(tabela2.datum,7,4) 


Tu bi moral paziti, da je datum oblike dd.mm.yyyy, sepravi 01.01.2013 in ne 1.1.2013.

V MySQL pa odvisno, kakšen tip podatka maš za datum. Če je date/time probaj dobiti leto s funkcijo YEAR(datum) ali kaj podobnega namesto SUBSTR. (mislim, da je ime funkcije v MySQL-u SUBSTRING)

Zgodovina sprememb…

Math Freak ::

Po INNER JOINU ni vejice, verjetno sem jo pridelal, ko sem oblikoval kodo.

111111111111 ::

Hvala za pomoč sem še malo dodatno brskal po spletu in si na koncu izdelal tole. :)

SELECT id,datum,stanje_kartic_na_dan,
(
  SELECT TOP 1 letna_kvota
    FROM tabela2
   WHERE id = t.id
     AND datum >= t.datum
   ORDER BY datum
) AS letna_kvota
  FROM tabela1 t


Si mi dal pa ideje. Tako kot prejšnjič hvala ti.

Sedaj me pa zanima če mogoče veš kako bi naredil sledeči izpis:
Imam:
tabela3
id|datum|stanje_kartic_na_dan|letna_kvota|
1|30.12.2013|23|100
1|31.12.2013|25|100
1|1.1.2014|35|150
1|2.1.2014|12|150
2|30.12.2013|34|200
2|31.12.2013|65|200
2|1.1.2014|43|300

Hočem dobiti:
tabela4
id|datum|stanje_kartic_na_dan|letna_kvota|
1|30.12.2013|23|100|23
1|31.12.2013|25|100|25-23
1|1.1.2014|35|150|35-25
1|2.1.2014|12|150|12-35
2|30.12.2013|34|200|34
2|31.12.2013|65|200|65-34
2|1.1.2014|43|300|43-65

Se pravi imam različne ID-je in najnižji datum se prepiše, potem pa se v naslednji celici vzame vrednost in se ji odšteje vrednost prejšnje (glej tabelo 4). Kakšna ideja?

Zgodovina sprememb…



Vredno ogleda ...

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

MySQL izpis vsebine iz dveh tabel

Oddelek: Programiranje
91078 (966) iMark
»

mysql poizvedba

Oddelek: Izdelava spletišč
7766 (585) sebavet
»

postgreSQL pomoč

Oddelek: Programiranje
131927 (1262) klemenSLO
»

MS Access (strani: 1 2 )

Oddelek: Programiranje
647046 (5104) travica
»

MYSQL vprašanje

Oddelek: Programiranje
131662 (1277) MrBrdo

Več podobnih tem