Hirdetés
-
Computex 2024: a GeIL memóriái között akad olyan, ami 10 GHz fölé merészkedik
ph A vállalat portfóliójában a hétköznapi DDR5 DIMM-eken kívül vannak CUDIMM, CSODIMM, CAMM2 és LPCAMM2 formátumú újdonságok is.
-
Retro Kocka Kuckó 2024
lo Megint eltelt egy esztendő, ezért mögyünk retrokockulni Vásárhelyre! Gyere velünk gyereknapon!
-
Kihagyták az NVIDIA-t egy új AI-hálózati szabványból
it Számos big tech cég összefogásával készült el egy új AI-hálózati szabvány, mindebből viszont kihagyták az NVIDIA-t.
Új hozzászólás Aktív témák
-
DS39
nagyúr
válasz sztanozs #3052 üzenetére
Szerintem túl gondolkodjátok az eredeti kérdésemet
Egyik adattáblából kinyert adatot, felhasználok egy másik adattáblából történő lekérdezéshez.az egyetlen bemenő paramétert az SSMS-ben írom bele a scriptbe futtatás előtt.
nem egy állandóan futó valamiről van szó, hogy kellene hozzá program. -
Louro
őstag
Sziaszotk!
Adott a PL SQL.
Performancia vagy stabilitási gondot okozhat ha egy normál script közé beszúrok egy procedurát? Vagy le se futna? Procedurával még csak most ismerkedek. De elsőre úgy érzem a VB tapasztalat segíthet.
Pl.:
select * from táblanév;update....;
create table táblanév2 as select * from táblanév3;
begin
declare
end;select count(8) from táblanév2;
select count(8), count(distinct oszlopnév) from táblanév3;Mess with the best / Die like the rest
-
Louro
őstag
Igazából az a feladat, hogy van egy tábla, amiben van x darab rekord. Ez folyamatosan változik. A rekordokat 3 részre kell megadott feltételek mentén bontani.
Az új táblában pedig
- 3 kategória alapján megszámolni mennyi rekord van az első táblában.
- majd mindegyikhez növekvő sorszámot társítani.Ezt most úgy csináltam meg - és lefutott - kivettem a 3 kategória darabszámát az első táblából. Majd 3 ciklussal mellé tettem a növekvő sorszámot.
SQL-lel még kategóriánként meg tudom számoltatni, hogy melyikhez mennyi tartozik, de a növekvő sorszámot már nem. Mondanám, hogy 3 temp tábla, de akkor extra táblákat kellene létrehozni.SQL ismeretem kicsit jobb, mint kezdő, de messze nem merész amatőr.
Mess with the best / Die like the rest
-
martonx
veterán
Ehhez group by-t kellene használnod plusz valami aggregátor függvényt (mondjuk count). Példa nélkül ennél konkrétabb segítséget nem fogsz kapni.
Azaz kóddal, meg ciklusokkal, meg ilyesmikkel nem kell bohóckodnod, pusztán az SQL mindezt megcsinálja neked, ráadásul sokkal gyorsabban mintha program kóddal szeded össze az adatokat.Én kérek elnézést!
-
Louro
őstag
válasz martonx #3058 üzenetére
Megpróbálom leírni a lényeget.
Adott az első alaptábla. Ezek rendelések. Három kategória a K, L, M.
Két oszlopa van. Azon és DB
Legyen a tartalma:
K1 - 5
L1 - 3
M1 - 12
K2 - 8
M2 -10
K3 - 7Az lenne a cél, hogy egy másik táblában mellé tegyem, hogy hányadik rendelés a hónapban kategóriánként.. Van egy tábla, ahol gyűlnek a sorszámok.
K-ból már 3, L-ből 2, M-ből pedig 5 rögzített sorszám van.
Az elvárt az lenne az új táblában, hogy
K1 - 4
K2 - 5
K3 - 6
L1 - 3
M1 - 6
M2 - 7Remélem így kerekebb.
[ Szerkesztve ]
Mess with the best / Die like the rest
-
Apollo17hu
őstag
Szerintem ketté kellene szedni az "azon" mezőt. Ha egyben marad, le kell vágni az első karaktert, és a mentén csoportosítani. Nem tudom ellenőrizni, hogy szintaktikailag helyes-e, de valahogy így nézne ki a sorszámozás:
SELECT rendeles.azon
,substr(rendeles.azon, 1, 1) ||
rank() over(PARTITION BY substr(rendeles.azon, 1, 1) ORDER BY rendeles.azon) +
CASE WHEN substr(rendeles.azon, 1, 1) = 'K'
THEN max_sorszam.max_k
WHEN substr(rendeles.azon, 1, 1) = 'L'
THEN max_sorszam.max_l
WHEN substr(rendeles.azon, 1, 1) = 'M'
THEN max_sorszam.max_m
END uj_azon
FROM rendeles
,(SELECT MAX(CASE WHEN substr(sorszam.azon,1, 1) = 'K'
THEN to_number(substr(sorszam.azon, 2)) END) AS max_k
,MAX(CASE WHEN substr(sorszam.azon,1, 1) = 'L'
THEN to_number(substr(sorszam.azon, 2)) END) AS max_l
,MAX(CASE WHEN substr(sorszam.azon,1, 1) = 'M'
THEN to_number(substr(sorszam.azon, 2)) END) AS max_m
FROM sorszam) max_sorszam[ Szerkesztve ]
-
Louro
őstag
válasz martonx #3060 üzenetére
Sziasztok,
@Apollo17hu : Köszönöm, jónak tűnik. Ma meglesem.
fiddle-t még nem használtam SQL-re, csak JAVA-s időkben.
De ez lenne a kód:
CREATE TABLE rendeles_db (
azon varchar2(10),
db number
);INSERT INTO rendeles ('K',1); --Első K rendelés
INSERT INTO rendeles ('K',2); --Második K rendelés
INSERT INTO rendeles ('L',1); --Első L rendelés
INSERT INTO rendeles ('M',1); --Első M rendelés
INSERT INTO rendeles ('L',2); --Második L rendelés
INSERT INTO rendeles ('K',3); --Harmadik K rendelés
COMMIT;CREATE TABLE rendeles_q (
azon varchar2(10),
rendeles_db number
);
--Itt a rendelésekhez tartozó darabszámot adjuk meg.
--A rendelésekhez pedig meg kellene mondani, hogy hányadik a hónapban.
INSERT INTO rendeles_q ('K',5);
INSERT INTO rendeles_q ('K',4);
INSERT INTO rendeles_q ('M',8);
INSERT INTO rendeles_q ('K',2);--Elvárt az lenne ne kézzel kelljen sorszámot adni a rendelésnek, hanem gép adja.
--Így nézne ki a temptábla, amit kapcsolótáblaként használnék fel:
--K,4
--K,5
--M,2
--K,6--Ha ez meglenne, akkor a rendelésekhez mellé tudnám tenni, hogy hányadik a hónapban.
--A rendeléshez az azonosító egyik eleme a sorszám.Köszönöm,
CsabiMess with the best / Die like the rest
-
bambano
titán
postgresql 9.1
van egy táblám, így kezdődik a definíciója:
Column | Type | Modifiers
---------------------------+-----------------------------+------------------------------------------------------
id | integer | not null default nextval('service_id_seq'::regclass)
customer_id | integer |
service_type_id | integer |
date | timestamp without time zone | default now()ebbe szeretnék olyan id-vel beszúrni, ami nem az alapértelmezett, ami a serialból jön:
insert into service (id,customer_id,service_type_id) values (1,19973,11);
ERROR: currval of sequence "service_id_seq" is not yet defined in this sessionezt hogy tudom megkerülni? (értelemszerűen nincs id ütközés, nincs 1-es id-jű rekord a táblában).
kösz
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
DavidPetson
csendes tag
Sziasztok!
Az alábbiakban kérném a segítségeteket:
Adott egy login rendszer, kapcsolódik is az SQL-hez, viszont amikor ki akarom irattatni a belépett felhasználó nevét, vagy bármilyen adatát, automatikusan az első felhasználó adatai jelennek meg, nem az aki belépett.
$sql = "SELECT * FROM member";
mysql_select_db('kliens');
$retval = mysql_query( $sql, $bd );
$row = mysql_fetch_array($retval)<?php echo "{$row['username']}" ?>
Arra gondoltam, hogy egy változót beírok a sql selecthez, viszont annyira ehhez nem értek és könnyen megeshet, hogy ennél jobb megoldás is létezik.
Előre is köszi a válaszokat
-
DS39
nagyúr
válasz DavidPetson #3065 üzenetére
hát ha nem adsz meg az SQL-nek, egy WHERE feltételt, honnan kéne tudnia, hogy te kinek a nevére vagy kíváncsi?
egy user_id-t át kellene adjál, amit amúgy a bejelentkezési session-ben el kellene tároljál, hogy tudd ki van épp bejelentkezve.
[ Szerkesztve ]
-
DavidPetson
csendes tag
Kiegészítettem ezzel:
$sql = "SELECT * FROM member WHERE username = $username";
Kaptam ezt:
mysql_fetch_array() expects parameter 1 to be resource, boolean given
Ezt próbáltam mindenhogy, és mindig ez a válasza rá
Elvileg azt menti:
$_SESSION['SESS_MEMBER_ID'] = $member['mem_id'];
[ Szerkesztve ]
-
DS39
nagyúr
válasz DavidPetson #3067 üzenetére
a lekérdezés egy hibát dob, de azt így php-n keresztül nem látod, futtasd le a kívánt lekérdezést a mysql-ben, és meglátod mi a gond, miért ad vissza boolean-t, a várt adatok helyett.
egyébként a username egy szöveges változó, és te a php bemenő paramétert csak így simán betolod neki. viszont az sql-ben ezt aposztrófok közé kéne tenni, akkor lesz sikeres a lekérdezés.
tehát nem username = kismarcsi mert most ezt kapja a mysql-ed, hanem username = 'kismarcsi'
[ Szerkesztve ]
-
Kommy
veterán
Hogy lehetne egy olyat csinálni, hogy egy oszlop szerint kiemelni valakiket a sor elejére úgy, hogy az oszlop alap értéke 0, ha valaki ki van emelve akkor ő ehhez kap +1-et , a következő még +1-et.
És ez a sorrend is fontos.Tehát az adatbázis azon oszlopa tele van 0-val majd az első aki a sorban is első lesz értéke 1 lesz a másodiké 2 és így tovább.
Egyáltalán lehet ilyet csinálni?
-
scream
veterán
Hali!
Aki nagyon otthon van PL/SQL-ben rám tudna esetleg privátban írni?
Köszönöm
P.S.: jellege miatt privát.
-
Novics
senior tag
Üdv szakik!
Remélem hajtotok el a gagyi access-es kérdésemmel.
Egy táblában vannak userek, és azok adatai, amik közül kettő érdekes a kezdő dátum és persze a név. Mindenkihez tartozhat több kezdődátum. Nekem össze kéne szednem, hogy userenként melyik a legkorábbi kezdődátum. Excelben simán megoldom, és lehet, hogy ez kavar be, hogy itt is ugyanúgy akarom, de egyszerűen elakadtam. A DMIN függvény kéne ha jól gondolom, de nem tudom neki megadni a tartománynál, hogy userenként keresse a legkisebb értéket, és ne az egész mezőben. Excelben csinálok egy táblát, amiben csak egyszer szerepel minden user, és megadom, hogy mindig az adott sorban lévő user nevénél keresse a minimumot. Gyanítom, hogy itt valami másik megoldás lesz, másik irányba kell elindulni.De merre?
A fontolva haladó. - 30 felett minden nap ajándék.
-
rum-cajsz
őstag
A csoportosító függvényeket keresed. Ha az SQL-t nem varázslóval kattintgatod, hanem szövegesen írod, akkor a "group by" része kellene neked. A kattintgatós részéhez nem értek sajnos.
select username,min(kezdődátum) from sajáttábla group by username;
=Kilroy was here============================ooO=*(_)*=Ooo=======
-
DS39
nagyúr
xml-ből szeretnék értéket lekérdezni sql-lel.
<data>
<answer id="1">Válasz1</answer>
<answer id="2">Válasz2</answer>
<answer id="3">Válasz3</answer>
<answer id="4">Válasz4</answer>
</data>úgy szedném ki a választ, hogy:
xml.value('(/data/answer[@id="3"])[1]', 'varchar(max)')
ez mind tök jó, de hogy lehet ezt dinamizálni?
tehát hogy egy másik helyről lekérdezem, hogy xy melyiket választotta, annak az értéke 2, és ezt a 2-est, hogy illesztem be fenti value függvénybe? mert string összefűzéssel nem engedivagy esetleg lehet valahogy hivatkozni arra egy where feltételben, hogy az @id mivel egyenlő?
[ Szerkesztve ]
-
martonx
veterán
Nem értettem teljesen a kérdésedet, de valami ilyesmi dinamikus lekérdezést szeretnél?
https://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql-server/
Azaz exec ('select * from table') - ahol a stringed igaziból bármi lehet, azt szépen végig fogja hajtani az sql motor.
Én kérek elnézést!
-
DS39
nagyúr
válasz martonx #3079 üzenetére
köszönöm a válaszodat, bár igazából ezzel most nem tudom mit kezdjek, ebben egy szó sincs xml feldolgozásról.
van egy lekérdezés egy táblából ahol az xml nevű oszlop értéke az alábbi xml részlet.
ebből értéket úgy szedek ki, hogy:
select xml.value('(/data/answer[@id="3"])[1]', 'varchar(max)') from table_name
de ez így fixen mindig minden sor esetében a 3-as id-s választ hozza le, nekem pedig az kellene, hogy a 3-as helyére dinamikusan tudjak egy számot bevinni.
mert ha ezt a kódot csak felbontom úgy, hogy :
xml.value('(/data/answer[@id="'+'3'+'"])[1]', 'varchar(max)')akkor ezt az választ kapom az sql szervertől:
The argument 1 of the XML data type method "value" must be a string literal.[ Szerkesztve ]
-
Novics
senior tag
Jönnék egy újabb kérdéssel.
Van egyszer a fentebb megoldott lekérdezés, ahol megkapjuk a legkorábbi kezdődátumot. De vannak olyan userek, akiknél nincsen ilyen dátum, hozzájuk egy másik táblázatban lévő kezdődátumot kellene beírni.
Van tehát 2 tábla:
szemad - itt található a jelenlegi kezdődátum
kmh - itt vannak felsorolva a korábbi munkahelyek, innét kellett a legkorábbit kikeresni
Nekem a jelentésre a kezdődátumhoz vagy a kmh-ban szereplő legkorábbi dátumot, vagy ha ilyen nincsen, akkor a szemad kezdődátumot kell kiíratnom. A két tábla a szemad.id = kmh.dolg mentén van összekapcsolva.Az IIF-re, és beágyazott lekérdezésekre gondoltam - de gondolva az előző megoldásra, lehet, hogy megint ágyúval megyek verébre -, amivel megvizsgálom, hogy a kmh-ban van-e érték, ha nincs, akkor a szemadból kérdezem le a jelenlegi kezdődátumot, ha van érték, akkor az ottani legkisebbet keresem meg.
SELECT szemad.id, szemad.nev, IIF(ISEMPTY((SELECT kmh.kezdete FROM kmh INNER JOIN szemad ON kmh.dolg = szemad.id WHERE kmh.beszamithato =YES)),(SELECT szemad.jogvisz_kezd FROM szemad),(SELECT kmh.kezdete FROM kmh INNER JOIN szemad ON kmh.dolg = szemad.id WHERE kmh.beszamithato =YES))
FROM szemad INNER JOIN kmh ON szemad.id = kmh.dolg
GROUP BY szemad.nev, szemad.id;Azt kapom vissza, hogy ez az allekérdezés legfeljebb egy rekordot képes visszaadni. Nem tudom, hogy ezt pontosan hogyan is kell érteni, de arra magamtól is rájöttem, hogy ez így nem lehet jó. Az allekérdezések ugye nem egy-egy értéket adnak vissza, szóval valahogyan meg kellene mondani nekik, hogy a külső SELECT szemad.id-hoz igazodó értéket adják csak meg. Ha a szemad.nev/id-t átneveztem AS-zel, és az allekérdezésekben meg a WHERE záradékban beírtam, hogy kulso_nev = szemad.nev, akkor meg azért rinyált, hogy a kulsp_nev nem szerepel összesítő függvényben, akkor sem, ha mindegyik függvénybe beleírtam. Szóval totális a káosz, és már nincsen több ötletem.
Közben azért guglizok, és felmerült, hogy esetleg valami olyan megoldás kellene, mint a programozásnál a szubrutinok. Lehet olyat, hogy megírja az ember a 3 lekérdezést, elnevezi őket, és utána csak rájuk hivatkozik? Gyanítom, hogy a külső FROM-ba bele kellene írni ezeket a lekérdezéseket is.
Van valami jó oldal, ahol érthetően, de nem 28ezer oldalon keresztül bemutatják a lekérdezéseket?
A Taylor-féle SQL for Dummies mennyire jó, mennyire szakmai?A fontolva haladó. - 30 felett minden nap ajándék.
-
Novics
senior tag
Az NVL-nél valahogyan meg kellene adni, hogy az ahhoz az emberhez tartozó jogvisz_kezd-et adja meg, akinél nincsen kmh.kezdete. Most eldobja magát, hiányzó művelet miatt. De itt ugyanúgy elakadok, hogy hogyan tudnám ezt megmondani.
bambano Még csak nem is hallottam róla - ez nem teljesen igaz, mert valahol láttam már, de nem néztem még meg -, de ez működik. Már csak az a gond, hogy akinek mind a két táblában van valid értéke, az kétszer szerepel. Sajnos allekérdezésbe nem lehet berakni, pedig próbáltam.
Tehát vagy az kellene megmondani, hogy a 2 táblából a kisebb értéket hozza ki, vagy pedig a kmh-s értéket, ha az valid, mivel az minden esetben kisebb.A fontolva haladó. - 30 felett minden nap ajándék.
-
bambano
titán
kiválasztod három külön lekérdezéssel az azonosítót meg a hozzá tartozó értéket, ezeket unionnal összerakod egybe, majd ezen group by azonosítóval kikeresed a legkisebbet.
elismerem, felmerülhet a vélemény, hogy kőbaltás módszerEgy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
Novics
senior tag
válasz bambano #3087 üzenetére
3 lekérdezés? Egyikben a szemad-ban a névhez tartozó jogvisz_kezd, a másikban a kmh-ben a dolg-hoz tartozó min(kezdet) where beszamithato. Mi a harmadik?
Találtam egy jónak tűnő leírást az unionról, de még nem volt időm átrágni magamat rajta. Arra gondoltam, hogy berakom egy táblakészítő lekérdezésbe, aztán utána arra is ráeresztek egy min()-t. Ez az igazán kőbalta, vagy inkább sima husáng megoldás!A fontolva haladó. - 30 felett minden nap ajándék.
-
tm5
tag
lehagytam egy záró zárójelet az NVL-es sor végéről, nem amiatt kapsz hibát? Mert amúgy szerintem ennek működnie kellene.
Amúgy nem lenne gond a mutatnál egy példát az adatokra, hogy mi van az egyes táblákban és hogy mi az elvárt select eredmény. 2 ember elég, egyiknél van kmh a másiknál nincs.
-
Novics
senior tag
Tényleg csak ennyi hiányzik. Ezt én is észrevehettem volna. Viszont most meg azon akad ki, hogy nincsen definiálva ez a függvény. Sajnos egész héten rendezvények vannak, és most nincsen túl sok időm ezzel foglalkozni, ettől függetlenül hálás vagyok minden segítségért. Még csak most ismerkedek komolyabban az SQL-lel, ez gondolom egyből látszott a kérdéseimen.
Ez egy dolgozói nyilvántartás, amiből jogszabálynak megfelelő adattartalommal jelentéseket kell generálnom. Az egyik kötelező adat a közalk. jogviszony kezdete. Ha a usernek volt olyan korábbi jogviszonya, ami beszámít a közalkalmazottiba, akkor annak a kezdődátuma kell, ezek közül természetesen a legkorábbi. (min(kmh.kezdete) where beszam = yes) Ha pedig nem volt ilyen jogviszonya - mert vannak olyanok, akiknek ez az első munkahelye, vagy nem beszámítható egyik korábbi sem -, akkor pedig az itteni jogviszony kezdődátuma kell. (szemad.jogvisz_kezd) Vissza kell kapnom mind a 238 dolgozót, viszont mindegyiket csak egyszer. Elég csak egy olyan tábla, ahol a név és a dátum szerepel, azt már be tudom rakni a jelentésbe. Ami maga szintén elég baltával faragott, biztosan van elegánsabb megoldás, de egyelőre működik, a csinosítás ráér.
Még mindig jöhetnek könyv, weboldal tippek, amin el lehet indulni felfedezni az SQL rejtelmeit.
A fontolva haladó. - 30 felett minden nap ajándék.
-
concret_hp
addikt
lehet béna vagyok, de nem jövök rá...
van egy alkérdésem, amiben van 7db oszlop. ennek az eredményét szeretném leszűrni úgy, hogy csak az a sor maradjon, amire:
alkerdes.egyikmező = min(alkerdes.egyikmező)hogy a francba kell ezt? where-be nem enged aggregáló fgv-t írni...
a favágó megoldás már megvan: orderelem egyimező szerint és veszem az első sort, csak ez picit pazarló az erőforrásokkal[ Szerkesztve ]
vagy fullba vagy sehogy :D
-
martonx
veterán
-
tm5
tag
válasz concret_hp #3091 üzenetére
Hát egyszer muszáj lesz végignyalni az alkérdést, hogy megtalálja a minimumot, de mondjuk talán a sort-ot meg tudod úszni:
Tedd bele az alkérdésbe 8. oszlopnak a következőt:
min(egyikmezo) over (partition by 1) as min_ertek
és akkor a fő select-ben beírhatod a where-be hogy:
alkerdes.egyikmezo = alkerdes.min_ertek
-
bambano
titán
légyszi kérdezzétek már meg az adatbáziskezelőtöktől, ha tud ilyet, hogy hány nap telt el szerinte 1752. január 1. és 1753. január 1. között? nekem postgresql ezt írja:
select '1753-01-01'::timestamp - '1752-01-01'::timestamp;
?column?
----------
366 days
(1 row)[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
-
bambano
titán
válasz Peter Kiss #3097 üzenetére
megnyugtató, hogy másik is rossz
mysql, db2 valaki?Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
bambano
titán
ez az oracle-s 1582-es válasz lenne a helyes válasz az 1752-re, csak miért nem abba az évbe teszi?
szerk: közben látom, hogy az 1582-es naptárreformot 1750-ben vették át törvényileg, és 1752-ben hajtották végre.
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
Új hozzászólás Aktív témák
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Alpha Laptopszerviz Kft.
Város: Pécs