- iPhone topik
- Milyen okostelefont vegyek?
- Profi EKG-s óra lett a Watch Fitből
- Keretmentesít a Galaxy S25 FE
- Yettel topik
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Xiaomi 15 - kicsi telefon nagy energiával
- Magyarországon is kapható a Moto G85 5G
- Redmi Watch 5 - formás, de egyszerű
Új hozzászólás Aktív témák
-
Louro
őstag
válasz
Petya25 #5942 üzenetére
Én eleve úgy szoktam mezőt létrehozni, hogy
create table [táblanév](
id bigint identity(1,1)
)Bár utólag is megoldható:
alter table [táblanév]
add id bigint identity(1,1)Ekkor 1-essel kezd és mindig eggyel növeli a mező értékét. Ha keletkezik egy új rekord, akkor megkapja a következő futószámot.
Remélem ez jó. A randommal az a bajom, hogy fontos-e az egyediség. Ha igen, akkor azt figyelni, hogy ki lett-e osztva az adott sorszám....De, ha nagyon beteg azonosító is jó, akkor:
alter table [táblanév]
add id varchar(1000)update [táblanév]
set id = newid()Ez elég random. A rand() függvénnyel meg generáltatsz egy véletlenszámot és azt írja be a mezőbe. Nem rekordonként generál egy számot. Ezért kaptad mindenhol ugyanazt.
-
Ispy
nagyúr
válasz
Petya25 #5813 üzenetére
Nos, ez azért van, mert az sql adatbázis kezelő, nem táblázatkezelő. Szóval ezt úgy kell csinálni, hogy összerakod az excelt, ami kiadja a pivotot, diagramot, akármit, a táblázatkezelő meg csak egy 2 dimenziós táblát a nyers adatokkal. Vagy leprogramozod sql oldalon egy tárolt eljárásban. Mindenesetre nem arra használod, amire kitalálták.
Nálunk ez úgy megy, hogy kifzeti a kedves ügyfél a 3-5-10 nap programozást a pivotért, vagy összekattintgatja magának 1 óra alatt, lehet választani, a kényelemnek ára van.
-
nevemfel
senior tag
válasz
Petya25 #5813 üzenetére
Szerintem is jó lenne egy ilyen dinamikus funkció, beépítve az adatbáziskezelőkbe, nagymértékben leegyszerűsíthetné az entity-attribute-value modellre épülő adatbázisok kezelését: [link]
Bizonyára megvan az oka annak, miért nem implementálják ezt. Talán mert összetett, talán mert számos egyéb problémát generál, nem tudom. Mindenesetre mysql alatt egyszerű a helyzet, mert nem tudja a nem dinamikusat sem
, de a példa alapján, tárolt eljárásból kezelve, nem tűnik vészesnek.
Ahol meg sehogy nem lehet megoldani, ott marad az, hogy az alkalmazásszerverben kell implementálni, nem SQL-ben.
-
nevemfel
senior tag
válasz
Petya25 #5810 üzenetére
Rákukkantottam a témára, ez a probléma "dynamic pivot" néven kering a neten, elég sokszor kérdezik, és nem triviális a megoldása. Ez talán a legegyszerűbb - legszemléletesebb példa:
Másik probléma magával a PIVOT-tal, hogy mint annyi minden SQL advanced feature, erősen SQL kiszolgálófüggő, hogy hogyan működik, illetve, hogy egyáltalán ismeri-e a PIVOT-ot. Pl. Mysql 5.7-ben biztosan nincs benne.
-
nyunyu
félisten
válasz
Petya25 #5569 üzenetére
Jó helyre raktad a zárójeleket?
Meg ahogy rákerestem T-SQL specifikus példákra, feltűnt, hogy mind a PIVOT előtti alquerynek, mind az azutáninak szoktak aliast adni.
Nem tudom, ez mennyire kötelező ott. (Oracle alatt opcionálisak)SELECT * FROM
(
SELECT datum, hely, ertek
FROM tabla
) x
PIVOT
(
SUM(ertek)
FOR datum IN (SELECT DISTINCT datum FROM tabla WHERE datum >= TRUNC(SYSDATE) - 7 ORDER by datum)
) p
ORDER BY hely; -
nyunyu
félisten
válasz
Petya25 #5567 üzenetére
SELECT * FROM
(
SELECT datum, hely, ertek
FROM tabla
)
PIVOT
(
SUM(ertek)
FOR datum IN ('2022-08-15', '2022-08-16', '2022-08-17')
)
ORDER BY hely;Kb. 5 percbe tellett testreszabni az első szembejövő PIVOT példát. (PIVOT szintaxis jóideje szabványos, mindegy melyik DB tutorialját nézed)
Bár lehet, hogy a dátumok kézzel felsorolása helyett elegánsabb lenne alselectet írni:
FOR datum IN (SELECT DISTINCT datum FROM tabla ORDER by datum)
-
Ispy
nagyúr
válasz
Petya25 #4948 üzenetére
Nem lenne jobb egy etető eljárás? Azt meghívod a paraméterekkel, megcsinálja az insertet és fut a következő.
Egyébként meg simán declare az elején, utána meg set @a=1 vagy set helyett lehet select is, ha nem változik az értéke, akkor meg nem írod felül.
Már ha jól értem mit akarsz.
Egyébként meg a GO miatt dobja a deklarációt, mert az a kódblokk vége, onnantól új kód fut.
Szóval valami ilyesmi kellene:
Declare rész
.
.
Set variables
Exec sp1
.
.
.
Set variables
Exec sp2
.
.
.
Set variables
Exec sp3
.
.
.
GO -
disy68
aktív tag
válasz
Petya25 #4802 üzenetére
A sys.objects-ben megtalálsz minden user által létrehozott objektumot. A sys.system_objects-ben a system által létrehozott és a sys.all_objects-ben pedig mindekettőt.
Ahogy a leírásban is benne van a különböző objektumok nevét megkaphatod az OBJECT_NAME függvény segítségével.Szűrsz a neked szükséges típusokra és meg is vagy.
-
nyunyu
félisten
válasz
Petya25 #4684 üzenetére
Először le kéne válogatni rendszámonként az utolsó dátumot, majd azokhoz a rendszám-dátum párosokhoz tartozó km értéket kikeresni a táblából.
Alselect helyett joinnal:
select
t.datum,
t.rendszam,
t.km
from tankolas t
join (select rendszam,
max(datum) max_datum
from tankolas t
group by rendszam) t2
on t.rendszam = t2.rendszam
and t.datum = t2.max_datum;Vagy rendszámonként besorszámozod dátum szerint csökkenőbe, és minden rendszámhoz az első rekordot veszed:
select datum,
rendszam,
km
from (select datum,
rendszam,
km,
row_number() over (partition by rendszam order by datum desc) rn
)
where rn=1;Egyébként ha meg feltételezzük, hogy a km állás monoton növekvő (magyarul nem szokták babrálni az órát), akkor egyszerűbben is lehet, hiszen a max(datum) és a max(km) érték ugyanazon a rekordon kéne hogy legyen:
select rendszam,
max(datum) datum,
max(km) km
group by rendszam;De ilyet ne feltételezzünk, mert a valóság az, hogy ahány adatrögzítő, annyiféleképpen sikerült bevinnie az adatot az évek során.
-
bambano
titán
válasz
Petya25 #4509 üzenetére
a probléma pár órás tojtorozása után nekem úgy tűnik, hogy a legegyszerűbb megoldás a következő:
csinálsz egy táblát, olyan szerkezettel, ami neked tetszik, plusz hozzáadsz egy oszlopot, pl. sor néve, text típussal:tmp=> \d merestmp
Table "public.merestmp"
Column | Type | Collation | Nullable | Default
--------+------------------+-----------+----------+--------------------------------------
id | bigint | | not null | nextval('merestmp_id_seq'::regclass)
subid | bigint | | |
azon | text | | |
meres1 | double precision | | |
meres2 | double precision | | |
meres3 | double precision | | |
meres4 | double precision | | |
sor | text | | |
utána belemásolod az input fájljaidat úgy, hogy a szövegből minden sort egyben tegyen bele a sor mezőbe:
\copy merestmp(sor) from '/tmp/mteszt.txt';
Majd adatbáziskezelős függvényekkel szétszeded a sorokat.
update merestmp set subid=id,azon=trim(both from sor) where array_length(regexp_split_to_array(sor,' +'),1)=1;
ezek után a subid-t beállítod az előtte levő sorra:
update merestmp m1 set subid=(select max(subid) from merestmp m2 where m2.id<m1.id) where array_length(regexp_split_to_array(sor,' +'),1)=5;
ennél a megoldásnál nyilván van szebb is, windowing funkciókkal...
utána már csak regexp-ekkel ki kell szedni a mezőket a sorból és betenni a helyükre. -
bambano
titán
válasz
Petya25 #4509 üzenetére
nem ismerem az mssql-t, postgresql-ben így csinálnám:
csinálnék egy táblát, amiben van egy id mező, aminek serial (más adatbáziskezelőkben autoincrement), meg van benne egy másik id2 mező, aminek a defaultja egy serial aktuális értéke, van egy text mező, meg négy real.
tennék rá egy szabályt, hogyha mind a négy real mezője null, akkor a második mezőt növelje egyel és úgy húzza be a többi sort.szerk: persze a triviális megoldás az, ha awk-val insert-té alakítod a fájlokat.
szerk2: esetleg dobj fel valahova 3-4 ilyen kis fájlt, amivel kísérletezni lehet.
-
válasz
Petya25 #4225 üzenetére
túlfolyik az integeren. sajnos a datediff_big() csak a 2016os sql servertől érhető el. túl sok adatod van, ha tudod, egy where klauzával le kell csökkenteni a számukat.
ellenőrzésképpen ennek a selectnek is ugyanezt a hibát kellene dobnia.
SELECT avg(DATEDIFF(MILLISECOND, '12/01/2015','12/30/2015'));
-
-
Louro
őstag
válasz
Petya25 #4216 üzenetére
Szia,
egy minta....bár ezért nem csípem az MSSQL-t....tengernyi sok CONVERT kell sokszor.
;WITH base AS (
SELECT GETDATE()-10 t
UNION
SELECT GETDATE()-8
UNION
SELECT GETDATE()
)
SELECT CONVERT(DATETIME,AVG(CONVERT(FLOAT,t)))
FROM BASESzóval először FLOAT-ba alakítod, majd a kapott átlagot visszaalakítod dátummá.Remélem tudtam segíteni.
-
tm5
tag
válasz
Petya25 #3973 üzenetére
Valami ilyesmi kellene:
SELECT *
FROM (
SELECT nev, ora, darab
FROM tabla
)
PIVOT ( sum(darab) FOR (ora) IN (10 'Ora 10', 11 'Ora 11', 12 'Ora 12') )
ORDER BY 1 DESC
A 10, 11, 12 óra értékek ha szövegek akkor tedd őket is aposztofok közé, illetve annyi ilyen 'ora-érték' 'ora-alias' párt kell felvenned az IN szekcióba, ahány oszlopra van szükség. -
válasz
Petya25 #3830 üzenetére
elvileg a dateadd simán időt is képes kezelni, viszont akkor a kezdő offsetet nem stringként, hanem time típusúként kell megadnod, így:
declare @starttime time(0) = '0:01';
declare @szam int = '2510';
select dateadd(mi, @szam,@starttime);
17:51:00
az előnye, hogy egyszerű, mint a bevert szög, mert nem kell castolgatni, trimmelegni.
a hátránya, hogy a nap feletti részt kapod meg, tehát ha 1 napnál több percre jön ki, akkor az óra:perc maradékot kapod, ahogy fent is látod (2510 perc több, mint egy óra). ha kell a nap is, akkor az már datetime. -
Peter Kiss
őstag
-
sztanozs
veterán
válasz
Petya25 #3703 üzenetére
Ne abban a táblában tartsd azokat a mezőket.
Select *-ra lejön minden mező.Le lehet tiltani bizonyos mezőkhöz való hozzáférést:
DENY SELECT ON dbo.tabla(mezo) TO [felhasznalo vagy role];
A legjobb ha letiltasz minden SELCT-et és írsz olyan VIEW-kat, amit szeretnél elérhetővé tenni. -
tm5
tag
válasz
Petya25 #3201 üzenetére
Ajaj, akkor elég gyenge az a szerver... azért 2*600k-t joinolni nem kéne problémának lenni manapság.
Az a baj, hogy sortolni muszáj lesz, hogy ki tudd választani a dátum alapján az aktuális árat, Esetleg ha 2 dátum oszlop lett volna az ár táblában akkor egy "eladás_dátum beween tol and ig" kifejezéssel ki lehetett volna kapkodni a megfelelő sorokat sort nélkül is. -
-
DS39
nagyúr
válasz
Petya25 #3041 üzenetére
Először próbálkoztam ezzel, de akkor a belső select-ben az id-ből próbáltam levonni, ahelyett hogy kívül tenném ezt. Pedig így működik.
és már a belső select-et is kiküszöböltem:
declare @i int = (select id from ...)
select oszlop1, oszlop2, @i - ROW_NUMBER() over(order by oszlop1)
from ...Köszönöm a segítséget.
-
bambano
titán
válasz
Petya25 #2943 üzenetére
nem kötözködni akarok, de a pontos feladatmegfogalmazás sokat dobna a végeredményen
a fenti példában miért nem 4 a helyes végeredmény? van egy a->b átmenet, egy b->a átmenet, majd ugyanez mégegyszer.az eltolt soros joinolás, amit martonx kollégánk kiválóan bedobott, is 4-et adna eredményül.
-
Ispy
nagyúr
válasz
Petya25 #2943 üzenetére
Esetleg egy függvény, ami ciklusban szépen végigmászik az értékeken, majd megszámolja. WHILE cikklus, ami egy SUBSTRING-gel végigmegy a mező tartalmán, ha változik az érték, akkor egyel növeled a számlálót.
Nem tudom mekkora tábláról van szó, azért az ilyen függvényekkel óvatosan kell bánni.
Most így hirtelen ennyi infóból ezt csinálnám, de lehet másnak van jobb ötlete.
-
nyunyu
félisten
válasz
Petya25 #1920 üzenetére
Mi a datum formatuma?
Pl. ha a win '2013-08-12'-ot ad vissza, az nem fog betalalni a '2013.08'-hoz.
Lehet, hogy egyszerubb lenne a year, month fuggvenyekkel szetdarabolni+a lekerdezesben ujra osszerakni a datumot, es akkor nem okozna gondot az eltero formatum.
SELECT * FROM honapok WHERE ho = " + "'" + YEAR(CAST(vizsgaltnap AS DATETIME)) + "." + MONTH(CAST(vizsgaltnap AS DATETIME)) + "'" + " and lezarva = 1
Legalabbis az SQL Server igy castolva siman megeszi a '2013-08-12', '2013.08.12', '08-12-13' formatumot is.
-
martonx
veterán
válasz
Petya25 #1847 üzenetére
Írsz rá egy kis programocskát, aztán az pont ezt fogja tudni, legalábbis a táblázat részéig elég triviális.
Az más kérdés, hogy diagramm nehezen lesz benne, bár kerülő utakkal biztos tudsz diagrammot képként generáltatni valamilyen eszközzel, és a képet már bele tudod szúrni a html formátumú emailbe. -
Új hozzászólás Aktív témák
Hirdetés
- AKCIÓ!!!Acer V3,FullHD core i5 6200u(4X2,8Ghz),8GBRAM,nVme
- Újszerű Lenovo,15,6"FullHd IPS,Ryzen 5(8x3,7Ghz)VEGA 8 VGA,12-20GB RAM,SSD+HDD
- Lenovo 14,1"Áthajtható Érintős FullHd,Ryzen 3,VEGA VGA,8-16GB DDR4 RAM,256-512SSD,Szép állapot
- ASUS GeForce GTX 1650 Phoenix OC 4GB GDDR6
- AKció!Fujitsu 15,6"FullHD IPS,i5 8265u(8x3,9Ghz)Vil.bill,4G LTE,8-32GB RAM,SSD,
- Bomba ár! Lenovo ThinkBook 14s Yoga - i5-1135G7 I 16GB I 256SSD I 14" FHD Touch I Cam I W11 I Gari
- AKCIÓ! Apple Macbook Pro 16" 2019 i7 9750H 32GB 500GB Radeon Pro 5300M hibátlan működéssel
- Kingmax 1x2GB DDR2 800 RAM eladó
- ÁRGARANCIA! Épített KomPhone i7 14700KF 32/64GB RAM RTX 5090 32GB GAMER PC termékbeszámítással
- Lenovo Thinkpad L14 Gen 4 -14"FHD IPS - i5-1335U - 8GB - 256GB - Win11 - 2 év garancia - MAGYAR
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged