Új hozzászólás Aktív témák
-
tm5
tag
válasz tvse1995 #3351 üzenetére
esetleg így: (adatok nélkül nem tudtam kipróbálni, de így tünt a legszimpatikusabbnak)
Select legfi.berlo_kulcs,
legfi.nev,
legfi.szuletesi_ido,
jarmukolcsonzes.kolcsonzes_kulcs,
jarmukolcsonzes.kiadas,
jarmukolcsonzes.visszavetel,
jarmukolcsonzes.jarmu_kulcs,
jarmu.marka,
jarmu.tipus
From
(Select berlo_kulcs
From ( Select Rank() Over (Partition By berlo_kulcs Order By szuletesi_ido Desc) rn, berlo_kulcs From berlo) Where rn In (2,3)) legfi
,jarmukolcsonzes
,jarmu
Where legfi.berlo_kulcs = jarmukolcsonzes.berlo_kulcs(+)
And jarmu.jarmu_kulcs(+) = jarmukolcsonzes.jarmu_kulcs[ Szerkesztve ]
-
tvse1995
senior tag
-
tvse1995
senior tag
válasz Ablakos #3354 üzenetére
Ez a változat lefut de nem ad vissza semmit:
Select legfi.berlo_kulcs,
legfi.nev,
legfi.szuletesi_ido,
jarmukolcsonzes.kolcsonzes_kulcs,
jarmukolcsonzes.kiadas,
jarmukolcsonzes.visszavetel,
jarmukolcsonzes.jarmu_kulcs,
jarmu.marka,
jarmu.tipus
From
(Select berlo_kulcs, szuletesi_ido, nev
From ( Select Rank() Over (Partition By berlo_kulcs Order By szuletesi_ido Desc) rn, berlo_kulcs, szuletesi_ido, nev From berlo) Where rn In (2,3)) legfi
,jarmukolcsonzes
,jarmu
Where legfi.berlo_kulcs = jarmukolcsonzes.berlo_kulcs(+)
And jarmu.jarmu_kulcs(+) = jarmukolcsonzes.jarmu_kulcsIgen, nem egyszerű ha ekkora késleltetéssel tudja meg az ember, hogy jó-e amit kitalált.
[ Szerkesztve ]
-
bpx
őstag
válasz Ablakos #3356 üzenetére
RANK helyett DENSE_RANK-ot kellene használni.
Magyarázat helyett itt a különbség a kettő között, így talán érthetőbb:
ADAT RANK DENSE_RANK
---- ---- ----------
A 1 1
A 1 1
A 1 1
B 4 2
B 4 2
C 6 3
C 6 3
D 8 4
D 8 4
D 8 4
E 11 5
E 11 5
F 13 6Ezen kívül a nev és szuletesi_ido oszlopokra is szükség van.
Ja látom az már megvolt.
[ Szerkesztve ]
-
tvse1995
senior tag
válasz Ablakos #3356 üzenetére
& -Zeratul-
Kis változtatásokkal ránézésre jó eredményt adott:SELECT legfi.berlo_kulcs,
legfi.nev,
legfi.szuletesi_ido,
jarmukolcsonzes.kolcsonzes_kulcs,
jarmukolcsonzes.kiadas,
jarmukolcsonzes.visszavetel,
jarmukolcsonzes.jarmu_kulcs,
jarmu.marka,
jarmu.tipus
FROM
(SELECT berlo_kulcs,
nev,
szuletesi_ido
FROM
(SELECT dense_Rank() Over (Order By szuletesi_ido DESC) rn,
berlo_kulcs,
nev,
szuletesi_ido
FROM berlo
)
WHERE rn IN (2,3)
) legfi ,
jarmukolcsonzes ,
jarmu
WHERE legfi.berlo_kulcs = jarmukolcsonzes.berlo_kulcs(+)
AND jarmu.jarmu_kulcs(+) = jarmukolcsonzes.jarmu_kulcs;Köszönöm mindenkinek, a határidő lejárt, remélem elfogadják.
-
nagyúr
Sziasztok!
Adott egy feladat:
Van két táblám, közel azonos struktúrával.
FelhasznaloOLD {Id, Nev, VonalKod, Aktiv, Reg, Kep, Jelszo, Felhasznalonev, FactFelhasz}
FelhazsnaloNEW {FelhasznaloId, TeljesNev, reg, Aktiv, Vonalkod, Jelszo, FelhasznaloNev, Kep, FactFelh}
A FelhazsnaloNEW táblában van ~400 rekord, a FelhasznaloOLD táblában ~50. Az OLD táblában lévő emberek megtalálhatóak mind a NEW táblában is, viszont nem egyezik sem a nevük, sem az id-jük. Nekem össze van írva hogy melyik-melyik id-vel van párban. Szóval pl. Kis Ilonka az OLD táblában 42-es id-vel szerepel, a NEW-ban meg 65-el és a neve is simán lehet Kovács Péterné.
A kérdés az, hogy hogyan másoljam át az OLD table-ből a VonalKod, Kep, Jelszo, Felhasznalonev, FactFelhasz oszlopokat a NEW table megfelelő rekordjába?
-
DS39
nagyúr
válasz Cathfaern #3360 üzenetére
hát azért az elég fapad megoldás lenne, és 50x 5-6 oszlop tartalmát módosítani...
ha ez az összeírás egy excelben történt, és nem papíron akkor könnyen megoldható.
ha papíron, akkor is egyszerűbb létrehozni egy kapcsoló táblát ezzel az 50 sorral (régi id, új id), utána lehet rá írni, egy update sql-t a többi adat áttöltésére. -
Cathfaern
nagyúr
Egy darab update-et kell írni, abban csak lecserélgetni az ID-kat. Nem úgy gondoltam, hogy kézzel irogassa át a táblákat Sok mindent lehet rá írni persze, de ha 50x kell megcsinálni, akkor bármit is írsz rá az tovább fog tartani, mint ha megcsinálod kézzel. Feltéve, hogy elsőre jól írsz meg mindent, mert ha már valamit debugolni kell (akár egy elgépelést), akkor sokkal tovább fog tartani
-
nagyúr
ha van olyan oszlopod, amit kulcsként tudsz használni (reg? felhasznalonev?), akkor simán összejoinolod a régi táblát az alapján az újba.
pl.update FelhazsnaloNEW
set FelhazsnaloNEW.VonalKod = FelhasznaloOLD.Vonalkod, FelhazsnaloNEW.Kep = FelhasznaloOLD.Kep, FelhazsnaloNEW.Jelszo = FelhasznaloOLD.Jelszo, , FelhazsnaloNEW.FelhasznaloNev = FelhasznaloOLD.Felhasznalonev, FelhazsnaloNEW.FactFelh = FelhasznaloOLD.FactFelhasz
from FelhazsnaloNEW
inner join FelhasznaloOLD
on FelhazsnaloNEW.Reg=FelhasznaloOLD.reg
előtte azért csinálj mentést a tábláról. =]
ha nincs, akkor marad az, hogy a biorobot megcsinálja kézzel.
ja és ha már typot emlegettük, a FelhazsnaloNEW-ban már van egy.[ Szerkesztve ]
Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
nagyúr
Koszi mindenkinek. Nincs olyan sor amit keynek tudtam volna hasznalni, ezert is irtam ide elso sorban. Vegul irtam egy updatet es abban cserelgettem ki az id-ket, eleg fapad, de 50 rekordnal meg belathato idon belul megvoltam vele.
A kapcsolotabla nem jutott eszembe
-
DS39
nagyúr
sziasztok!
nekem egy olyan segítség kellene, hogy hogyan lehet dinamikusan oszlopokat létrehozni egy select-ben?
pl. van egy lista jelenleg
user_id | össz_pontés egy ilyesmi szeretnék csinálni.
user_id | össz_pont | 2017-01-01 | 2017-01-02 | 2017-01-03 | 2017-01-04 | 2017-01-05A dátumok alá, az adott napon szerzett pontok jelennének meg. Ez nyilván nem gond, viszont nem fix dátumok lennének az oszlopok, hanem lenne egy TOL - IG dátum paraméter, ami alapján kellene létrehozni az oszlopokat.
remélem érhetően írtam le, és tudtok segíteni.
-
nagyúr
sajnos csak a pivot xml viseli el a dinamikus queryt, egyébként marad, amit Ispy is írt, mert a pivotnál szükséges a transzponálandó oszlopok pontos ismerete.
[ Szerkesztve ]
Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
DS39
nagyúr
Köszi, mindkettőtöknek, próbálkozom ezekkel.
-
DrojDtroll
addikt
A következő két lekérdezés azonos eredményt add.
SELECT tanulok.nev, tanulok.osztaly, leadasok.idopont, leadasok.mennyiseg
FROM `leadasok`, tanulok
WHERE tanulok.tazon = leadasok.tanulo and osztaly LIKE "1_"SELECT tanulok.nev, tanulok.osztaly, leadasok.idopont, leadasok.mennyiseg
FROM `leadasok`, tanulok
WHERE tanulok.tazon = leadasok.tanulo and osztaly = 1"az osztály oszlop értékei amiket keresünk "1A" és "1B". Mysql-t használtam a feladatok megoldásához.
Miért ad a két megoldás azonos(jó) eredményt? A másodiknak nem kellene hibásnak lenne?
-
DS39
nagyúr
válasz DrojDtroll #3370 üzenetére
csodálom hogy egyik is jó.
like-nál szerintem %-ot kellen használni, a másiknál meg lemaradt egy ilyen " -
sztanozs
veterán
A második ezért találja meg: http://stackoverflow.com/a/16791526
Gyakorlatilag Integer-t cast-ol a stringből, és a
cast("1B" as int) = 1
igaz lesz.Mysql-ben az underscore az 1-karakter helyettesítő elem: [link]
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
nagyúr
válasz sztanozs #3372 üzenetére
a query szintaktikailag akkor is helytelen, amit nem értek, hogy erre miért nem dob hibát az ide.
Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
sztanozs
veterán
válasz DrojDtroll #3375 üzenetére
A macskaköröm a második SQL végén.
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
kem
addikt
Sziasztok!
Adott egy Oracle TimesTen memoriaban futo DB amirol szeretnek ERD-t kesziteni, mert egyszeruen nem latom at igy nyersen. Tudtok erre valami megoldast?
Koszi elore is!
kem
Köszi!
-
Chesterfield
senior tag
Sziasztok!
MS SQL-ben szereték egy triggert készíteni, ami abban az esetben, ha egy adott táblába bekerül egy új sor, azt átmásolja egy másik táblába.tudtok segíteni?
köszönöm
-
harylmu
őstag
válasz Chesterfield #3379 üzenetére
szerintem ez eléggé bad practise. nem tudod ezt mashogy megoldani?
egyebkent ha beirod googlebe hogy 'trigger on insert mssql' akkor elso talalat.
[ Szerkesztve ]
-
Ispy
veterán
válasz Chesterfield #3379 üzenetére
Mi ezzel a cél? Mert ok, átmásoltad, de az eredeti sor nem változhat meg utána?
Egyébként egy INSERT triggert kell írni, ez akkor fog lefutni, amikor bekerül a rekord a táblába. Az inserted nevű táblában lesznek a rekordok, onnan kell egy INSERT utasítással beírnod a másik táblába.
Kb. így néz ki:
CREATE TRIGGER dbo.teszt
ON dbo.azeredetitábládneve
FOR INSERT
AS
INSERT INTO amásiktábládneve (mezőkfelsorolva)
SELECT mezőkfelsorolva
FROM inserted"Debugging is like being the detective in a crime movie where you're also the murderer."
-
SUPREME7
őstag
Sziasztok, hogyan lehetne megoldani egy ilyen lekérdezést?
Pl van egy ilyen tábla:
Vonalkód | Áruház | Ár
111 | Buda | 400Ft
111 | Pest | 400Ft
222 | Buda | 600Ft
222 | Pest | 650FtAz lenne a cél. hogy csak azokat a termékeket listázza amiknél van áreltérés egyes áruházak között. Tehát az első esetben mindkét áruházban ugyanaz a termék ugyanazon az áron van, de a másik már eltérő árral van. Én csak ezeket szeretném listázni.
-
updog
senior tag
Sziasztok,
Félig SQL, félig logikai dilemmám lenne: minden hétköznap(!) este érkezik hozzánk a megrendeléseket tartalmazó adatfile, amit rámergelünk az előző adatokra.
Betöltés után kell generálnunk egy kimeneti fájlt. A trükk az, hogy amíg a megrendelés státusza nem végleges (legyen mondjuk 0), addig minden nap újra meg újra ki kell tennünk a fájlba, akkor is ha aznap nem módosult, de ha aznap váltott 0-ra, akkor aznap kell még exportálni, de utána többször nem.
Egy view-ból generáljuk az adatokat, és ha csak mód van rá, szeretném úgy megoldani, hogy a táblába ne kelljen hozzáadni az "elküldve" vagy hasonló oszlopot, csak a view módosításával viszont nem látom, hogy ezt a "utoljára még elküldöm de többször nem" feltételt hogy írjam meg, ha az utolsó státuszváltás után nem változik a rekord (tehát a feltételnek igaznak kell lennie aznap amikor érkezett, de utána már nem).
Példa:
MEGR MEGR_DATUM MOD_DATUM STATUSZ ADAT_ERKEZETT
---- ---------- --------- ------- -------------
1234 20170502 null 1 20170502Új megrendelés 2017.05.02-n, betöltés után kimentjük fájlba.
03-án nem módosul a rekord, de exportáljuk.
MEGR MEGR_DATUM MOD_DATUM STATUSZ ADAT_ERKEZETT
---- ---------- --------- ------- -------------
1234 20170502 170504 2 20170504Státusz módosult, nem végleges státusz, exportáljuk.
05-én nem módosul, de exportáljuk
MEGR MEGR_DATUM MOD_DATUM STATUSZ ADAT_ERKEZETT
---- ---------- --------- ------- -------------
1234 20170502 170506 0 20170508Státusz módosult (6-án!), amikor megérkezett a módosítás (május 8!) még kigeneráljuk, de 9-én és utána már nem.
(M)Nyilván eddig megvan:
SELECT * FROM MEGRENDEL WHERE STATUSZ <> 0
AND ... --itt még van 1-2 business feltétel
;Ami a triviális megoldás hogy felveszek egy ELKULDVE oszlopot, és küldés után updatelem 1-re, és hozzáadom a feltételt:
AND NVL(ELKULDVE,0)=0
De mivel a tábla tisztán business adatokat tartalmaz, nem nagyon tetszene senkinek, ha én ilyen technikai jellegű oszlopot felvennék. Sajnos sysdate-re alapuló feltétel se játszik mert a beérkező fájl jöhet éjfél előtt, után, vagy akár aznap ki is maradhat, akkor másnap kétnapi adat megy be.
[ Szerkesztve ]
"Bocs, főnök, de én csak két emberben bízom. Az egyik én vagyok. Nem maga a másik." || "Hóhahó, mégis van graffaló!"
-
Ispy
veterán
Adat érkezett megegyezik a napi dátummal és a státusza egyenlő 0-val, vagy a statusz nem egyenlő 0.
WHERE (ADAT_ERKEZETT = CONVERT(GETDATE(), 112) AND STATUSZ = 0) OR (STATUSZ <> 0)
[ Szerkesztve ]
"Debugging is like being the detective in a crime movie where you're also the murderer."
-
updog
senior tag
Kicsit hülyén fogalmaztam meg, illetve egy dolgot kihagytam: nem működhet a dátumos dolog, mert az ADAT_ERKEZETT értéke mindig a business nap szerinti dátum, ezt program adja hozzá.
Tehát: ma este (is) akár éjfél előtt, akár éjfél után kaphatjuk a fájlt, 20170509-es értéket fogunk oda beírni. Sajnos ez is benne van a pakliban.
Szóval gyanús hogy legalább egy segédtábla lesz a vége, rendelési szám + elküldve mezőkkel, aztán belefonom a viewba... csak ugye ezt se szerettem volna.
"Bocs, főnök, de én csak két emberben bízom. Az egyik én vagyok. Nem maga a másik." || "Hóhahó, mégis van graffaló!"
-
-
updog
senior tag
Megoldás (#3387) Ispy nyomán (azért még nem 100%-os, mert mondjuk évente 2-3x kérik hogy valamelyik napi adatokat küldjük már újra, na akkor majd ez nem lesz jó ).
SELECT * FROM MEGRENDEL
WHERE (STATUSZ <> 0
OR STATUS = 0 AND ADAT_ERKEZETT = SELECT MAX(ADAT_ERKEZETT) FROM MEGRENDEL)
AND ... --itt még van 1-2 business feltétel"Bocs, főnök, de én csak két emberben bízom. Az egyik én vagyok. Nem maga a másik." || "Hóhahó, mégis van graffaló!"
-
kw3v865
senior tag
Sziasztok!
Egy Triggeres kérdésem lenne hozzátok: MS SQL 2012-ben írok egy triggert, amely INSERT-t hatására fut le, és az új rekord egyik mezőjét frissíti. Hogyan kell hivatkozni az újonnan beszúrt rekordra?
Tehát csak és kizárólag az új sor egy celláját kell update-elnie.Most csak úgy működik, ha megadom az új rekord objectid-ját.
Jelenleg így néz ki:
CREATE TRIGGER nepesseg_szum ON OVEZETEK
AFTER INSERT
AS
BEGINDECLARE @TERULET GEOMETRY;
SET @TERULET=(SELECT SHAPE FROM OVEZETEK WHERE OBJECTID=26);
UPDATE OVEZETEK SET Nepesseg_ossz = (SELECT SUM (TELEPULES.LAKOSOK) FROM TELEPULES
WHERE TELEPULES.SHAPE.STWithin(@TERULET)=1) WHERE OVEZETEK.OBJECTID=26;
RETURN
END;Azt akarom, hogy ne kelljen megadni az objectid-t, hanem mindig a beszúrt sorra fut le. Hogyan lehetne ezt megoldani?
-
DS39
nagyúr
válasz kw3v865 #3394 üzenetére
Szia!
Ezt úgy lehet megoldani, hogy megnézed mi lenne insertálva:
INSTEAD OF INSERT
AS
BEGININSERT INTO TABLANEV (oszlopnevek....)
SELECT oszlopnevek...
FROM INSERTED IEND
--------
itt a SELECT-en belül használhatsz CASE WHEN-eket, hogy adott oszlop értéke ha ez, akkor legyen helyette amaz. remélem érted[ Szerkesztve ]
-
DS39
nagyúr
vagy ha nincs egy konkrét érték amit vizsgálj, akkor az INSERTED selectjében ki cserélhetetd azt az oszlopértéket a belső selected sum-jára.
SELECT oszlop1, oszlop2,
(SELECT SUM (TELEPULES.LAKOSOK) FROM TELEPULES
WHERE TELEPULES.SHAPE.STWithin(I.SHAPE)=1),
oszlop4, oszlop5 ....
FROM INSERTED I(@terulet helyett bekerülendő shape oszlop értékét betéve, már nem kell tudd az objectid-t)
[ Szerkesztve ]
-
kw3v865
senior tag
Köszönöm, így már elég jól működik, de még nem tökéletes: már csak arra kell megoldást találni, hogy ha egynél több sort szúrok be az övezetek táblába, akkor is működjön.
Tehát ha pl. 2 új sor van, akkor ezt írja ki: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Jól gondolom, hogy ehhez kurzort kellene használni?
-
kw3v865
senior tag
Egyelőre így néz ki jelenleg a triggerem a kurzorral, de a probléma továbbra is ugyanaz.
ALTER TRIGGER nepesseg_szum ON OVEZETEK
AFTER INSERT
AS
BEGINDECLARE @TERULET GEOMETRY
DECLARE @ID INTDECLARE @kurzor CURSOR
SET @kurzor = cursor FOR
SELECT SHAPE, OBJECTID FROM INSERTEDOPEN @kurzor
FETCH NEXT FROM @kurzor INTO @TERULET, @IDWHILE @@FETCH_STATUS = 0
BEGIN
UPDATE OVEZETEK SET Nepesseg_ossz = (SELECT SUM(n.lakosok) from NEPESSEG_EOV N
WHERE N.SHAPE.STWithin(@TERULET)=1) WHERE @ID=(SELECT OBJECTID FROM INSERTED);FETCH NEXT FROM @kurzor INTO @TERULET, @ID
ENDCLOSE @kurzor
DEALLOCATE @kurzor
END;Vajon hol ronthattam el?
-
DS39
nagyúr
válasz kw3v865 #3399 üzenetére
túlbonyolítod, de itt:
@ID=(SELECT OBJECTID FROM INSERTED)
minek a kurzor, ha itt benne hagyod azt a belső selected ami több sort fog visszahozni.
miért nem csinálod úgy ahogy írtam az elején?
ALTER TRIGGER nepesseg_szum ON OVEZETEK
INSTEAD OF INSERT
AS
BEGIN--és a triggeren belül insertálod
INSERT INTO OVEZETEK (oszlopnevek....)
SELECT oszlop1, oszlop2,
(SELECT SUM (TELEPULES.LAKOSOK) FROM TELEPULES
WHERE TELEPULES.SHAPE.STWithin(I.SHAPE)=1),
oszlop4, oszlop5 ....
FROM INSERTED IEND
--(kb ennyi, csak egészítsd ki a tényleges oszlopnevekkel a selectben, és az insert into sorban)ne after insert után update-elj, hanem eleve ne engedd addig az insertet a táblába míg át nem alakítod úgy az eredményt, ahogy neked megfelelő.
így szerintem nem kapnál eleve ilyen hibaüzenetet, hiszen az inserted táblában soronként egy SHAPE érték lesz, ezért a SUM is csak egy értéket ad vissza.
[ Szerkesztve ]
Új hozzászólás Aktív témák
- Végre prezentálta a Snapdragon X szériát a Qualcomm
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Kormányok / autós szimulátorok topicja
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Bemutatkozott a Polestar Phone
- Milyen egeret válasszak?
- gban: Ingyen kellene, de tegnapra
- Napelem
- PlayStation 5
- Xbox Series X|S
- További aktív témák...
- AMD Radeon Pro W7900 48GB GDDR6
- ZBook Firefly 14 G9 14" FHD+ IPS i7-1255U T550 32GB 512GB NVMe SSD IR kam gar
- PowerColor RX 6800 XT Red Dragon 16GB GDDR6 256bit - Számla + Garancia, Ár alatt! BeszámítOK!
- MacBook Pro M1MAX 64gb ram 1TB SSD Áfás
- Konzolok karbantartása - hűtőpaszta csere - takarítás (minden 10. karbantartás INGYENES)