Megválaszolatlan hozzászólások | Aktív témák Pontos idő: pén. márc. 29, 2024 6:29



Hozzászólás a témához  [ 23 hozzászólás ] 
SQL kérdés 
Szerző Üzenet
vas-tag

Csatlakozott: pén. jún. 24, 2011 10:46
Hozzászólások: 2
Hozzászólás Re: SQL kérdés
Tehát ha jól értem, ezek szerint tényleg meg tudom csinálni ugyanazt az ORBER BY-jal, mint az indexeléssel, csak sebességbeli különbség van? Azért kérdezem, mert mondjuk egy könyvelő programban, ahol a számla alapján könyvelés közben az ember kiválaszt egy partnert, nekem jó lenne, ha azt is meg tudnám csinálni, hogy bármelyik oszlopra hirtelen le tudnám rendezni a partnertörzset. Például a számlán nem látszik az eladó bélyegzője tökéletesen, ezért csak töredék információk alapján tudom kikeresni a partnert. Tehát ilyen esetben tök jó lenne, ha esetleg indexelés nélkül is bármelyik oszlopra le tudom rendezni a partnereket ezzel az ORDER BY záradékkal. Tudsz még erre mondani valamit, hogy jól gondolom-e, vagy félreértettem?


pén. jún. 24, 2011 11:33
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 4773
Tartózkodási hely: Siófok
Hozzászólás Re: SQL kérdés
Az indexelés alapvetően a lekérdezést segíti. Ha egy oszlophoz nincs index, akkor az összes sort végig kell ellenőrizni, melyik felel meg a feltételnek (rendezetlen halmaz). Ha van index, akkor az alapján gyorsabban mehet a szűrés (rendezett halmaz).

Megj.: A fórumot nem kell állandóan olvasni, kérhetsz értesítést a témához. 8)


pén. jún. 24, 2011 11:19
Profil Privát üzenet küldése
vas-tag

Csatlakozott: pén. jún. 24, 2011 10:46
Hozzászólások: 2
Hozzászólás Re: SQL kérdés
Sziasztok, kezdő Delphi programozó és kezdő SQL-es vagyok. Azt a kérdést szeretném feltenni, hogy mi értelme van az SQL-ben egy relációhoz indexet készíteni (CREATE INDEX), ha a SELECT parancsban van egy ORDER BY záradék, amivel ugyanazt meg tudom csinálni. Vagy nem??? Minden hozzászólás érdekel, mert mindenből tudok tanulni. Azt kérem, hogy aki válaszol, az jelezze a volgyi_peter@konstruktura.hu email címemre, mert nem tudom ezt a fórumot mindig olvasni. Nagyon köszönöm mindenkinek a segítséget, aki szán egy kis időt egy kezdő okítására. Völgyi Péter, 2011.06.24.
volgyi_peter@konstruktura.hu


pén. jún. 24, 2011 10:52
Profil Privát üzenet küldése
ezüst tag

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 60
Hozzászólás Re: SQL kérdés
Sziasztok!
Van egy ilyen egyszerű lekérdezésem:

SELECT T0.[ItemCode], T0.[Dscription], T1.[CardCode], T0.[Quantity], T0.[Price], T0.[LineTotal], T0.[TotalFrgn]
FROM INV1 T0 INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
WHERE T0.[DocDate] >=[%1] and T0.[DocDate] <= [%2]

Azt szeretném megoldani, hogy az eredménylistát csoportosítsa T1.CardCode szerint és az egyes csoportok végén összesítse a T0.Quantity és a T0.LineTotal mennyiségeket.
Tudna valaki segíteni? :hm:


szer. jún. 02, 2010 8:12
Profil Privát üzenet küldése
platina tag

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 754
Hozzászólás 
Kösz! Nehezebbet vártam :D


vas. nov. 30, 2008 14:39
Profil Privát üzenet küldése
arany tag

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 146
Hozzászólás 
NickE írta:
Azt hogy lehet megcsinálni, hogy van egy pl. 1000 sort tartalmazó táblám de a lekérdezésnél csak 30 sort szeretnék látni, ami kifér egy képernyőn és léptető gombokkal szeretnék tovább menni.

Legyen pl. autok tábla.
SELECT * FROM autok LIMIT 30; behúzza az első 30-at, de ha a 31-60 tartományt szeretném látni, akkor hogyan tovább?
MySQL-t használok.


SELECT * FROM autok LIMIT X,Y
Ahol X az első rekord Y pedig a rekordok száma.

Azaz
a SELECT * FROM autok LIMIT 0,30 visszaadja az első 30 találatot,
a SELECT * FROM autok LIMIT 30,30 visszaadja a második 30 találatot,
a SELECT * FROM autok LIMIT 60,30 visszaadja a harmadik 30 találatot

Részletes magyarázat és példa:

http://www.tonymarston.net/php-mysql/pagination.html


vas. nov. 30, 2008 13:12
Profil Privát üzenet küldése
platina tag

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 754
Hozzászólás 
Azt hogy lehet megcsinálni, hogy van egy pl. 1000 sort tartalmazó táblám de a lekérdezésnél csak 30 sort szeretnék látni, ami kifér egy képernyőn és léptető gombokkal szeretnék tovább menni.

Legyen pl. autok tábla.
SELECT * FROM autok LIMIT 30; behúzza az első 30-at, de ha a 31-60 tartományt szeretném látni, akkor hogyan tovább?
MySQL-t használok.


vas. nov. 30, 2008 12:23
Profil Privát üzenet küldése
ezüst tag
Avatar

Csatlakozott: vas. feb. 20, 2005 21:51
Hozzászólások: 69
Tartózkodási hely: Tizenháromker-AngyalfŐd
Hozzászólás 
Sparow2 írta:
Nem count(*)-ot kell mondani (mint én is rosszul írtam a fenti példában), hanem count(városkód)-ot.
A count a null értékeket nem számolja, és 0-t kéne visszaadnia a null-os mezőre.
(Legalábbis ORACLE-ban, meg 1-2 másik adatbázisban amit már használtam így működik, de a MySQL-t nem ismerem.)


Hú, de nagyon igaz!

Természetesen MySQl-ben is így van! :]


csüt. szept. 18, 2008 11:21
Profil Privát üzenet küldése
vas-tag

Csatlakozott: szer. szept. 17, 2008 15:44
Hozzászólások: 2
Hozzászólás 
Köszönöm a segítséget mindkettőtöknek!
Mivel MS SQL-ről van szó így a Sparow2 megoldása azonnal működött is amit alig akartam elhinni mert én is hasonlóval próbálkoztam, csak jóval komplikáltabban és nem működött jól.
Valahogy így nézett ki:

SELECT Varosnev, (SELECT Count(2tabla.[Serial Number]) FROM 2tabla, 1tabla where (((1tabla.[VarosID])=2tabla.VarosID))) AS Expr1
FROM 1tabla, 2tabla
WHERE ide egy csomó kivétel került
GROUP BY 1tabla.Varosnev;

Na ez nem működött, de a lényeg az, hogy amit írtál az igen.

KÖSZÖNÖM!


csüt. szept. 18, 2008 10:17
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: hétf. jún. 26, 2006 11:21
Hozzászólások: 2544
Hozzászólás 
ChrisPapa írta:
A konkrét MySQL verzióval egészíteném ki Sparow2 hozzászólását:

Kód:
select if( varos.id is null, 0, count(*) )
from eszkoz_data eszkoz left outer join varos_data varos on eszkoz.varos_id = varos.id
group by eszkoz.varos_id


Ez is a "left join"-nal operál, a "select"-ben a feltétel azért kell, mert akkor is visszatér egy sorral a count, ha az eszköz táblában nem talált v.mely városhoz. (Ebben az esetben a jobb oldali táblában szereplő mezőket NULL értékkel tölti fel.)

Nem count(*)-ot kell mondani (mint én is rosszul írtam a fenti példában), hanem count(városkód)-ot.
A count a null értékeket nem számolja, és 0-t kéne visszaadnia a null-os mezőre.
(Legalábbis ORACLE-ban, meg 1-2 másik adatbázisban amit már használtam így működik, de a MySQL-t nem ismerem.)
Valami ilyesmi akkor:
Kód:
select tabla1.varosnev, count(tabla2.varoskod) as db
  from tabla1 left outer join tabla2 on tabla1.varoskod = tabla2.varoskod
group by tabla1.varosnev

És tényleg jó ötlet, hogy a count meg a group nélkül nézd meg, rögtön látod mi történt (főképp, ha nagyon kevés sor van és átlátható könnyen)


csüt. szept. 18, 2008 10:13
Profil Privát üzenet küldése
ezüst tag
Avatar

Csatlakozott: vas. feb. 20, 2005 21:51
Hozzászólások: 69
Tartózkodási hely: Tizenháromker-AngyalfŐd
Hozzászólás 
A konkrét MySQL verzióval egészíteném ki Sparow2 hozzászólását:

Kód:
select if( varos.id is null, 0, count(*) )
from eszkoz_data eszkoz left outer join varos_data varos on eszkoz.varos_id = varos.id
group by eszkoz.varos_id


Ez is a "left join"-nal operál, a "select"-ben a feltétel azért kell, mert akkor is visszatér egy sorral a count, ha az eszköz táblában nem talált v.mely városhoz. (Ebben az esetben a jobb oldali táblában szereplő mezőket NULL értékkel tölti fel.)

A könnyebb megértés érdekében lefuttathatod először a count és a join nélkül is:

Kód:
select *
from eszkoz_data eszkoz left outer join varos_data varos on eszkoz.varos_id = varos.id


csüt. szept. 18, 2008 9:37
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: hétf. jún. 26, 2006 11:21
Hozzászólások: 2544
Hozzászólás 
1. tábla
Budapest 11
Mezőtúr 12
Bugyi 13

2. tábla
klf1234 13
krth125 13
krtlop14 13
hjloo14 12

Ami nekem kellene a lekérdezés eredménye kép az ez:
Budapest 0
Mezőtúr 1
Bugyi 3

Ha kicsik a táblák, jó így is:
Kód:
select városnév, (select count(*) from 2tábla where 2tábla.városkód = 1tábla.városkód)
  from 1tábla


Ha nagyobbak, akkor outer join-t érdemes csinálni, mert a fenti példában a count(*)-s alselect az eredmény minden rekordjára lefut (ha mondjuk 10 sor jön ki, akkor 10-szer számlálja végig a táblát, ha 1000 rekord jön ki, akkor 1000-szer, a Te példádban csak 3-szor). Outer joinnal csak egyszer megy végig mindkét táblán. Ennek megadása adatbázisonként más lehet. ORACLE-ban pl. ennyi:
Kód:
select tabla1.varosnev, count(*) as db
  from tabla1, tabla2
 where tabla1.varoskod = tabla2.varoskod (+)
group by tabla1.varosnev

/* Esetleg érdemes lehet belevenni a group-ba és a select listába a tabla1.varoskod-ot is, mert igazából az az egyedi, de most a példa szempontjából mindegy. */

A (+) azon az egyenlőségjel azon oldalán van, amelyik tábla sorai helyett töltse a null értékeket.

PostgreSQL-ben vagy Sybase-ben, ha jól emlékszem, nem (+) hanem (*) kellett és éppen az ellentétes oldalra.
Ha nem tévedek van valami szabványos megoldás is, amit minden relációs adatbáziskezelőnek ismernie kell, valami ilyesmi, de lehet nem pontosan így kell:
Kód:
select tabla1.varosnev, count(*) as db
  from tabla1 left outer join tabla2
 where tabla1.varoskod = tabla2.varoskod
group by tabla1.varosnev

Itt ha jól tudom, a bal oldali tábla minden rekordja szerepelni fog (amikhez nincs meg a párja a jobb oldali táblában).
Van a fordítottja a rigth outer join, amikor értelemszerűen ugyanez, de a jobb oldali táblából szerepel minden rekord. Meg van full outer join (ha így hívják) amikor mindkét táblából az összes rekord kijön.
Persze a legtöbb ember (én is) ezt ritkán használja, mert egyszerűbb odaírni egy (+)-ot, mint azt, hogy "left outer join" (bár talán a "left outer" is elég, azt hiszem).

Na, nem próbáltam ki a pédákat, ha esetleg valamit rosszul írtam le, és nem futna le, azért ezekből már ki tudsz indulni. Neten rá tudsz keresni: outer join.
Remélem segítettem.


csüt. szept. 18, 2008 9:05
Profil Privát üzenet küldése
vas-tag

Csatlakozott: szer. szept. 17, 2008 15:44
Hozzászólások: 2
Hozzászólás 
Sziasztok,

Az lenne a problémám, hogy van két táblám:
1. helység melynek van egy száma (ez az azonosító) és egy neve
2. eszköz melynek van egy száma(azon) és többek közt még egy száma mely arra utal, hogy melyik helységben van az eszköz.
Tehát kb ilyen:

1. tábla
Budapest 11
Mezőtúr 12
Bugyi 13

2. tábla
klf1234 13
krth125 13
krtlop14 13
hjloo14 12

Ami nekem kellene a lekérdezés eredménye kép az ez:
Budapest 0
Mezőtúr 1
Bugyi 3

Tehát egy Count kell amivel az gondom, hogy mivel a 2. táblában nem szerepel a Budapest azonosító száma ezért a végeredményben csak a Mezőtúrt és Bugyit kapom.
Hogy a francba csináljam, hogy a fent leírt táblát kapjam?


szer. szept. 17, 2008 15:57
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: hétf. jún. 26, 2006 11:21
Hozzászólások: 2544
Hozzászólás 
Ha jól értlemezem:
A táblában van 3 mező:
azon, azon1, azon2
És azok a sorok kellenének, ahol ugyanahhoz az azon-hoz azon1 és azon2 is többször szerepel.

Sztem:
select azon, azon1, azon2
from tabla
group by azon, azon1, azon2
having count(azon1) > 1 and count(azon2) > 1

Mivel groupolnod is kell, meg szűrnöd is, ezért kell having.


kedd nov. 13, 2007 9:54
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás 
Őszinte leszek én az alapfelállást sem értem. Nem tudnál egy táblát idebigyesszteni pár sorral? Meg azt, hogy mit szeretnél látni!


hétf. nov. 12, 2007 17:26
Profil Privát üzenet küldése
arany tag

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 474
Hozzászólás 
az en kerdesem valami ilyesmi lenne:
adott 1 tabla (valojaban sok de igy egyszerubb elmondani)
van benne 3 mezo. egy csoport azon (ismetlodik) egy azon1 es egy azon2 (valojaban a ket azon tobb tablan keresztul join-olva jon fel).
azokat a sorokat (csoportokat) kellene listazni amelyeknel az azon1 es azon2 is tobbszor fordul elo (de csak azokat). amelyek 1:n vagy n:1 tipusuak azok nem erdekelnek, csak az n:n. eleg a csoport azon, nem baj ha duplikal vagy megjelenik a tobbi mezo is.
mindezt valami primko sql-ben mert tobb fele kezelore kene. most valami havingos countos dolgon kapisgalok de hatha van valakinek jobb otlete :)


hétf. nov. 12, 2007 16:33
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás 
Szia!

Bár elviekben már késő :(
De következő kódfrissítésnél lecserélem, mert kúvva jó :)
Nagyon szépen köszönöm!!!

Üdv,
Zsoca


kedd aug. 28, 2007 16:17
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: hétf. jún. 26, 2006 11:21
Hozzászólások: 2544
Hozzászólás 
Zsoca:
A második megoldásodban annyiszor lefut a két belső al-select ahány sorod van a táblában. Nagy táblánál nagyon lassú lesz.

Esetleg egy ilyet javasolhatnék:

Kód:
select a as nev,
         sum(decode(b, 'igen', 1, 0)) as igen,
         sum(decode(b, 'nem', 1, 0)) as nem
  from tabla
 group by a

Ez egyszer megy csak végig a táblán.


kedd aug. 28, 2007 14:01
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás 
Az ilyen csávókat metyu, ha tehetném legalább fél évre eltiltanám a teljes nettől, de nem tehetem, úgyhogy csak a fórumról fogunk eltiltani :evil:


pén. aug. 17, 2007 8:38
Profil Privát üzenet küldése
vas-tag

Csatlakozott: csüt. aug. 16, 2007 17:16
Hozzászólások: 1
Hozzászólás 
http://s2.gladiatus.hu/game/c.php?uid=17617

itt van sokmindenre megoldás


csüt. aug. 16, 2007 17:17
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás 
Már van egy még egyszerűbb megoldásom (egyik kollegám besegített :) ):
Kód:
SELECT DISTINCT nev AS "Név",
      (SELECT COUNT(*)
               FROM valaszok
            WHERE valasz='igen' AND nev=t.nev) "Igenek",
      (SELECT COUNT(*)
               FROM valaszok
            WHERE valasz='nem' AND nev=t.nev) "Nemek"
      FROM valaszok t;


kedd aug. 14, 2007 14:23
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás 
Elvileg van megoldásom, csak túl bonyolultnak tűnik :(
Kód:

SELECT nev AS "Név", DECODE(cnt1,null,0,cnt1) AS "Igenek", DECODE(cnt2,null,0,cnt2) AS "Nemek" FROM
   (SELECT nev, COUNT(nev) cnt1
     FROM valaszok
    WHERE valasz='igen'
    GROUP BY nev),
   (SELECT nev, COUNT(nev) cnt2
    FROM valaszok
    WHERE valasz='nem'
    GROUP BY nev)
    WHERE n1(+) = n2

UNION

SELECT nev AS "Név", DECODE(cnt1,null,0,cnt1) AS "Igenek", DECODE(cnt2,null,0,cnt2) AS "Nemek" FROM
   (SELECT nev, COUNT(nev) cnt1
     FROM valaszok
    WHERE valasz='igen'
    GROUP BY nev),
   (SELECT nev, COUNT(nev) cnt2
    FROM valaszok
    WHERE valasz='nem'
    GROUP BY nev)
    WHERE n2(+) = n1;


Valaki tud egyszerűbbet?


kedd aug. 14, 2007 9:12
Profil Privát üzenet küldése
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás SQL kérdés
Sziasztok!

Már tök hülyének érzem magam, mert marha egyszerűnek tűnik, de 45 perce ezzekl szívok és ennyit már nem ér :(

Szóval adott egy tábla legyen mondjuk 2 oszlopa A és B.
B értéke két értéket vehet fel, pl. igen-nem.
Legyen pl a tartalom ez:
A, B
Zsoca, igen
Zsoca, igen
Zsoca, nem

Nekem egy olyan SELECT kéne, ami ezt adja vissza:
A, x, y
Zsoca, 2, 1

Ahol x az igenek száma, y a nemek száma (egy sorban).

Előre is kösz ha valaki csípőből idevágja
Üdv,
Zsoca


hétf. aug. 13, 2007 13:38
Profil Privát üzenet küldése
Hozzászólások megjelenítése:  Rendezés  
Hozzászólás a témához   [ 23 hozzászólás ] 

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 7 vendég


Nem nyithatsz témákat ebben a fórumban.
Nem válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Magyar fordítás © Magyar phpBB Közösség