Portál AbcLinuxu, 7. května 2025 01:59
popis hodnota minus 10 bbb -30 plus 50 cccc 2 minus 25potreboval bych vybrat pouze radky ktere obsahuji v prvnim sloupci "plus" nebo "minus", tam kde je "minus" tak zmenit znamenko v sloupci hodnota a udelat SUM(hodnota). Takze -10+50-25 Normalni SUM delam takto:
select sum(t1.hodnota) from tabulka t1 where t1.popis like 'plus' or t1.popis like 'minus'Jde nejak doplnit ten select a dostat pozadovany vysledek? Dekuji. Tom
Řešení dotazu:
Tohle tam přičte i druhý a čtvrtý řádek, takže byste buď musel přidat
... where t.popis in ('plus','minus')
nebo místo iif
použít case
:
case T1.POPIS when 'plus' then T1.HODNOTA when 'minus' then -T1.HODNOTA else 0 end
A nebo obecněji
create table NAME2COEF ( NAME varchar(16) primary key, COEF integer ); insert into NAME2COEF values ('plus', 1); insert into NAME2COEF values ('minus', -1); select sum(NC.COEF * T.HODNOTA) from TABULKA T inner join NAME2COEF NC on NC.NAME = T.POPIS;
Nakonec ale stejně často nejjednodudšší bude udělat dva obyčejné selecty a odečíst výsledky.
Tohle je prostě potřeba řešit případ od případu a hlavně s ohledem nejen na aktuální situaci, ale i na výhled do budoucna. Pokud mám jistotu, že ty váhy budou na věky věků vždy jen tyhle dvě, tak to klidně udělám kterýmkoli z těch jednodušších postupů. Ale pokud bude riziko, že jich časem bude víc nebo že se dokonce budou měnit, jdu do referenční tabulky. Tohle je problém podobných dotazů v poradně, protože optimální řešení často závisí na informacích, které nemáme - a někdy je v daném okamžiku nemá ani tazatel.
Stejně je to i s tou závěrečnou poznámkou. Teoreticky je "jeden dotaz" efektivnější než "dva dotazy", ale praxe může být často jiná, pokud se kvůli tomu, aby to byl "jen jeden dotaz" budou dělat moc velké vylomeniny. Nemluvě o tom, že dva selecty nemusejí nutně znamenat dva samostatné dotazy klienta na server.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.