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

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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… nový
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… nový
tupolev 05.03.2025 13:07
tupolev
tabulka, stlpce a struktura dat je jasna . . . potrebujem z toho dostat ciste data, jeden prikaz sel… nový
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

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