Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem MSSQL select

Uz som zistil ze su tu chytrejsi ako, tak ak by niekto z nich mal cas . . . .
mam zamestnancov, kazdy ma jedinecne ID, a kazdy moze mat priradeny v jeden den jeden kod z 1,2,3,4,5,6 . . .
Na konci mesiaca kazdemu na zaklade kodu spravim nejaky prepocet.
Ale pre technicke problemy moze mat uz zadany jeden zamestnanec na jeden den aj dva spolu suvisiace pevne zadane kody, napr 1,10; 2,34; 3,33.
Takto by som mu to spocital vlastne dvakrat, ked tam ma dva kody.
Potrebujem u tych, ktory maju dvojicu kodov, aby sa bral do uvahy len druhy.
Napriklad
id kod
a 1
b 2
c 1
c 10

takze zamestnaci s id 'a' a 'b' ok, ale u zamestnanca 'c' potrebujem vylucit riadok id 'c' a kod 1, lebo potrebujem unho pracovat len s riadkom s kodom 10
Da sa to v jednom selecte nejako vybrat?
Nemozem vyhodit kod 1 , lebo to by som vyhodil aj zamestnnaca 'a'
ked som to mal po jednom , tak mi to pekne spocitalo takto
select id,mesiac,sum(hodiny) from casy where (kod=1 or kod=2 or kod = 10) group by id ....
Nemozem to ani odpocitavat napr ze spocitam samostatne 1 a 10 a navzajom odpocitam, lebo v 1 a 10 mozu byt rozne hodnoty

Předmět Autor Datum
Pro vyber je nutné určit pořadí řádků. Podle čeho se dá určit, který z těch 2 kódů 1 nebo 10 je ten…
Jan Fiala 03.03.2025 13:37
Jan Fiala
Myslel som ze by som nejako vypisal dvojice kodov, nieje ich az tak vela . . . . Ale ano, druhy je v…
truhlik 03.03.2025 14:38
truhlik
Nastrel dobry, vypise mi riadky so spravnym id, aj kodom, lenze neviem ich spocitat . . . je tam stl…
truhlik 03.03.2025 18:30
truhlik
A co chces spocitat? Chces secist vsechny radky nebo jen ty s nejvetsim kodem nebo? Kdyz to poradne…
Jan Fiala 03.03.2025 18:59
Jan Fiala
Myslel som ze si to uz lahko doplnim . . .. tabulka id kod suma a 1 150 b 2 200 c 1 300 c 10 500 vy…
truhlik 03.03.2025 19:10
truhlik
Ja teda neviem..., ale nešlo by to jednoducho takto? select id, kod, max(suma) as suma from tabulka…
pme 03.03.2025 19:29
pme
Asi nie, lebo suma moze byt akakolvek, kludne najvyssie id moze mat najnizsiu sumu kludne id kod su…
truhlik 03.03.2025 20:46
truhlik
Bože no tak potom takto: select id, max(kod) as kod, suma from tabulka group by id výsledok bude :…
pme 03.03.2025 20:56
pme
CREATE TABLE pracovnici ( ID varchar(5), kod int, Datum date, suma int ); INSERT INTO Pracovnici(ID…
zavo 03.03.2025 20:56
zavo
SQLStaTE = 37000 MS ODBC Driver 17 for SQL Server Nespravna syntaxe pobliz klicoveho slova where Ak…
truhlik 03.03.2025 22:09
truhlik
select b.ID, b.Datum, b.Kod, sum(b.suma) from pracovnici b where b.Kod = (select max(a.kod) from pra…
zavo 03.03.2025 22:18
zavo
Estli dobře rozumím popisu,tak problém není s návrhem databáze ani vkládání hodnot,ale s získáváním…
tupolev 05.03.2025 13:07
tupolev
tabulka, stlpce a struktura dat je jasna . . . potrebujem z toho dostat ciste data, jeden prikaz sel…
truhlik 06.03.2025 16:49
truhlik
Vzdyt uz jsem ti odpovedel. Vybrat id, den a vyssi kod umis. Tak tento vyber pouzij a napoj to na da… poslední
Jan Fiala 06.03.2025 18:18
Jan Fiala

Pro vyber je nutné určit pořadí řádků. Podle čeho se dá určit, který z těch 2 kódů 1 nebo 10 je ten druhý? Je tam nějaký čas?
Nebo prasácky, je ten druhý kód vždy numericky větší než ten první?

V prvním případě by se muselo nejprve vybrat pro pracovníka a den např. podle data a času ten druhý kód a to pak použít v JOIN pro fnální výběr.
Něco jako:

select a.ID, a.DatumCas, a.Kod
from pracovnici a
join (select ID, DatumCas as Max(DatumCas) from pracovnici group by ID, Convert(Date, DatumCas)) b on a.ID = b.ID and a.DatumCas = b.DatumCas

ve druhem pripade, kde mam pouze datum (na prasaka) by stacilo vybrat ten vyssi kod v ramci dne

select a.ID, a.Datum, Kod = Max(kod)
from pracovnici
group by ID, Datum

Myslel som ze by som nejako vypisal dvojice kodov, nieje ich az tak vela . . . .
Ale ano, druhy je vzdy vecsi . . .
takze v pohode v ramci jedneho moze mat jeden zaznam alebo jednu dvojicu
trocha som to upravil, lebo sa jedna o 3 skupiny cisel takze som pridal este where kod in () . . . .
a je to ono
dik
ono staci ten spravny pohklad na data (brat vzdy najvecsi kod) a nespekulovat ako vyhodit ten mensi a porovnavat ci je jeden alebo dva . . .

DIKY

Nastrel dobry, vypise mi riadky so spravnym id, aj kodom, lenze neviem ich spocitat . . . je tam stlpec suma, a ked tam pridam sum(suma) tak mi to zase spocita cez vsetku kody . . . , aj ked mam zobrazene len prislusne riadky a spravne
Myslel som ze to tam v pohode doplnim, ale moja chyba . . . . bud doplnanim sa dostanem tam, ze musim do group doplnit kod, a v tom pripade tam mam zase vsetky, alebo mi napise chybu agregacnej fkc . . . .
select a.ID, a.Datum, Kod = Max(kod), sum(suma)
from pracovnici where kod in (1,2,5,10)
group by ID

skusal som dat aj nieco ako podmienku pre ten sucet (SELECT SUM(suma) FROM pracovnici where msl=max(msl))
alebo doplnit za where and EXISTS (SELECT msl=max(msl) . . .
ale nic nevedie k uspechu . . . .

A co chces spocitat? Chces secist vsechny radky nebo jen ty s nejvetsim kodem nebo?
Kdyz to poradne nepopises, tezko se radi. Ani nezname struktury a na tvuj monitor nevidime.

Pokud chces sesumovat pouze ty vyssi kody, tak vyber vyssich kodu mas, tak to zkombinuj s tim prvnim prikladem, ktery jsem ti daval. Jen to napojis na Id, kod a den

Myslel som ze si to uz lahko doplnim . . ..
tabulka
id kod suma
a 1 150
b 2 200
c 1 300
c 10 500

vysledny sect by mal dat vysledok id, sum(suma) za podmienky ako som spominal vyssie, teda tu 150+200+500
id 'c' s kodom 1 (suma 300) sa nezapocita do sumy, lebo existuje vyssi kod (10) pre id 'c'

id-eciek moze byt kolkokolvek, kodov tiez niekolko skupin, kazda skupina ma max 4 kody, vzdy sa spocitava v ramci tej jednej skupiny, kody v danej skupine su pevne dane, v tomto pripade 1,2,10
resp pary kodov su pevne dane, k 1 moze byt 10, ale iny nie, nemoze byt napr 2 a 10
teda kto ma 2 ma len 2
kto ma 1 , moze mat samostatne 1 , ale moze mat 2 riadky 1 a 10, v tom pripade sa riadok s 1 v tom sucte ignoruje
skusim sa tym este pohrat, ziadny cas tam nieje, je to povedzme vzdy v ramci mesiaca

Asi nie, lebo suma moze byt akakolvek, kludne najvyssie id moze mat najnizsiu sumu
kludne

id kod suma
a 1 150
b 2 200
c 1 300
c 10 50

v tom pripade stale musim spocitat polozku a 1 suma 150 + polozka b 2 suma 200 a polozka c 10 v sume 50

CREATE TABLE pracovnici (
ID varchar(5),
kod int,
Datum date,
suma int
);

INSERT INTO Pracovnici(ID, kod, Datum, suma) VALUES ('a',1, '20250101', 5);
INSERT INTO Pracovnici(ID, kod, Datum, suma) VALUES ('b',2, '20250101', 10);
INSERT INTO Pracovnici(ID, kod, Datum, suma) VALUES ('c',1, '20250101', 7);
INSERT INTO Pracovnici(ID, kod, Datum, suma) VALUES ('c',10, '20250101', 15);
INSERT INTO Pracovnici(ID, kod, Datum, suma) VALUES ('d', 2, '20250101', 10);
INSERT INTO Pracovnici(ID, kod, Datum, suma) VALUES ('d', 34, '20250101', 20);

-- QUERY database
select b.ID, b.Datum, b.Kod, sum(b.suma)
from pracovnici b
join (select ID, Datum, max(Kod) as max_kod
from pracovnici
group by ID, Datum
) a
where a.ID=b.ID
and a.Datum=b.Datum
and a.max_kod=b.Kod
group by b.ID, b.Datum, b.Kod;

Estli dobře rozumím popisu,tak problém není s návrhem databáze ani vkládání hodnot,ale s získáváním dat a nějakým výpočtem skóre. A dilema je , jak udělat bussines logiku, jestli to počítat rovnou v databázi (hodí se, pokud tohle je jenom část problému, následuje další zpracování, řazení, filtrování...) nebo získat z databáze čistá data a tu logiku udělat v neznámém programovacím jazyce(python?)?
Jako ono by šlo tu logiku narvat do sql dotazu, . napadá mě COALESCE(kod1,kod2) (ne idiotské case switch, i to existuje v sql) ... Ale jsou oba kódy rovnocenné z hlediska dalšího zpracování? A nebo pokud to chceš vyšperkovat, můžeš si přidat sloupec kod_switch a potom použít ten switch kod_switch kde vybereš který sloupec to má vrátit. Může se to hodit, když bude potřeba právě mít uložené obě kody, ale volit si zaměřovačem, jaký kod u každého id

CT 
    CASE 
        WHEN column_b = 'some_value' THEN column_c
        ELSE column_d
    END AS result_column
FROM your_table;

Koukám, že si dal ukázku, kde máš 2x c ,jednou s kódem 1(2), potom s kódem 2(10). To je jedna možnost.Druhá možnost je mít právě strukturu {id,kod1,kod2}. Jsou situace, kdy jedno řešení může být lepší,ale volil bych dva sloupce, už jen ,že můžeš definovat kod1=datový typ enum(1,2,három,3), 2=enum(10,20,ps,wtf), ale pak zase budeš mít v resultu (select id,kod_mix) smíchaný typy něco jako enum1 +enum2, což ani nevím jestli jde, prrávě proto možná místo enum použít string

ale třeba je to vymyšlené, že vše běží v SQL? potom první dilema je jasné

tabulka, stlpce a struktura dat je jasna . . .
potrebujem z toho dostat ciste data, jeden prikaz select, max mozno viac cez union, nemozem ulozit ani proceduru . . .
ako dostat pre osoby sucet hodnot pre prislusnu skupinu kodov
resp ako spocitat v tej sume len vyssi kod, ak sa tam nachadza aj s nizsim kodom, ale tie dvojice su pevne dane
napr skupina kodov 1,2,3,4, pricom napr je pevne dana dvojica 3 a 4
osoba moze mat na kazdy den 1 alebo 2 kody, povedzme postupne dni prvy den 1 dalsi 3, dalsi 2, dalsi 1, ....1,1,2,2,1,2,1,3, . . . ale moze mat aj v jeden den zadane 3 a 4 - to je ta pevna dvojica, ked je 4 musi byt aj 3, alebo len 3 samoztatne . . . . a ked sa vyskytne takato dvojica, ako zapocitat do sumy len ten vyssi kod (4, hodnotu pre kod 3 ignorovat), teda hodnotu ktoru reprezentuje v dalsom stlpci suma

Zpět do poradny Odpovědět na původní otázku Nahoru