Wyliczenia kilku kolumn w zależności od wartości 1 kolumny

0

Witam,

wydaje mi się, że to banalna kwestia ale mam jakieś kompletne zaćmienie aktualnie. Także proszę o podpowiedź bo na forum jakoś nie znalazłem :|

Kwestia jest prosta buduje zapytanie w którym przeliczam rożne pola jak cena / wartość i kilka innych w zależności od kolumny Waluta. Czyli coś na zasadzie:

Select CASE WHEN po.[waluta] = 'EUR' THEN ROUND(pol.[wartosc], 4) ELSE ROUND(pol.[wartosc] / (po.[xrate1] / po.[xrate2]), 4) END AS WartoscEUR,
CASE WHEN po.[waluta] = 'EUR' THEN ROUND(pol.[cena], 4) ELSE ROUND(pol.[cena] / (po.[xrate1] / po.[xrate2]), 4) END AS CenaEUR, pole1, pole2 ... FROM ...

Pytanie czemu nie sprawdzić raz czy jest EUR i wtedy dać pola jak są, a jak jest inaczej to przeliczyć po kursie. Nie chcę za każdym razem dla każdego pola sprawdzać czy waluta jest EUro czy nie, czyli taki nadrzędny case ?

Z góry dzięki za jakiekolwiek odpowiedzi.

Pozdrawiam...

Ps. Jako, że to mój pierwszy post to jeszcze raz Witam wszystkich ;)

1

nie da się tak - przy każdym polu musi być sprawdzanie

2

Możesz zrobić cos na zasadzie:

SELECT ..., wartosc*wsk, cena*wsk, ... FROM (SELECT po.waluta, pol.wartosc, pol.cena, CASE WHEN po.waluta='EUR' THEN po.xrate2/po.xrate1 else 1. END wsk , ... FROM ...) x

tylko raz wtedy sprawdzasz walutę.

0

Dzięki Panowie za obie odpowiedzi. Podejście MAricna jest całkiem interesujące, ciekaw jestem jak to jest z optymalizacją - w sensie które zapytanie szybciej poleci pisząc jednak za każdym razem sprawdzenie waluty, czy przy tym 2. Teoretycznie wydaje się, że 2 powinno być szybsze hmm. Póki co wielkie dzięki, muszę to sprawdzić u siebie na przykładzie ;)

1

Moim zdaniem ten współczynnik można wyliczać wyłącznie podczas insert/update do tabeli po.

Dodajemy kolumnę wyliczalną:

ALTER TABLE po ADD rate AS CASE WHEN waluta = 'EUR' THEN 1. ELSE 1/(xrate1 / xrate2) END PERSISTED;

Wówczas pozostaje nam takie zapytanie:

SELECT	ROUND(pol.[wartosc]*po.rate, 4) AS WartoscEUR
	   ,ROUND(pol.[cena]*po.rate, 4) AS CenaEUR

Odczyty się tutaj nie zmienią, ale oszczędzamy procesor. Sprawdziłem i przy zwróceniu ok 300 000 wyników mamy oszczędność rzędu 30-40% względem CPU i co za tym idzie duration.

0

Dzięki Vardamir - właśnie uzmysłowiłeś mi, że jestem baran tudzież miałem naprawdę zaćmienie w pt. W tym konkretnym przypadku (przeliczanie waluty) oczywiście, że nie muszę sprawdzać czy jest EURo czy nie .... tylko z klucza zawsze wykonywać działanie - dla EURO kurs w tablicy jest 1 /1 także szybciej będzie liczyć zawsze niż sprawdzać jaka waluta.

Także w tym przypadku dzięki za rozjaśnienie mi umysłu .... w innych przypadkach to 2 rozwiązanie Marcina może być ciekawe (jeśli działanie matematyczne będzie dla wszystkich kolumn takie same).

1 użytkowników online, w tym zalogowanych: 0, gości: 1