Tema: Re: MSSQL 2008 ir prioritetinis duomenu istraukimas
Autorius: CGI 600
Data: 2012-04-11 22:37:03
Nu jo, uz tokiu selektus nagus nukapot, ta pacia lenta keturis kartus 
joinint, cia kur taip moko, uzdaryt tokia lafke :) Daug prirasyta tingiu 
gilintis, bet paziurejus i selekta tai niekas neaisku :), kad ir si 
dalis 'S.Svoris BETWEEN K1.SvorisNuo And K1.SvorisId', kas guli cia 
'K1.SvorisNuo', kodel lyginama su ID, jei teisingai speju kokie duomenys 
turi guleti lentose (pagal pavadinimus) tai DB architektas tikriausiai 
antram kurse mokes kai sita projektavo.

O siaip, nesigilinant i neaiskumus, aisku be ju kazko tikslaus 
nepasiulyti, mano akimis cia galima isisukti pasinaudojus 'WITH' lenta 
joje pasigrupuojant duomenis, arba vienas left joinas kuriame tvarkingas 
selektas su tvarkinga where dalimi, jei per sunku pasirodytu su left, 
tada outer apply, su pastaruoju paprasciau, bet ir leciau veiks, aisku 
greiciau nei pateiktas sprendimas :)

Nu ir nepatingejau tiek parasyt :D

On 2012.04.10 19:24, Jornada Del Muerto wrote:
> Sveiki,
>
>      Turiu tokia situacija su MSSQL 2008, kada reikia istraukti tam tikra informacija prioriteto tvarka isrenkant viena ar kita irasa is lentos.
>
>      Trumpai aktuali traukimui struktura:
>
> Siuntos
> ----------
> Id
> KlientoId
> MiestoId
> GatvesId
> Svoris
>
> SiuntuKainos
> ----------
> Id
> KlientoId
> MiestoId
> SvorisNuo
> SvorisIki
>
> Dilema ta, kad kainu yra 4 tipai (tiksliau nuo siol bus).  Egzistuoja (jeigu id=0 reiskia skirta visiems):
>
> 1. Bendros/globalios kainos siuntoms (KlientoId = 0, miestoId = 0);
> 2. Bendros/globalios kainos konkreciam miestui (KlientoId = 0, miestoId = X) - (sis kainos variantas atsiras tik dabar);
> 3. Kliento bendros kainos (KlientoId = X, miestoId = 0);
> 4. Kliento kainos konkreciam miestui (KlientoId = X, miestoId = X).
>
> Prioriteto tvarka bandoma priskirti sias kainas: 4, 3, 2, 1.
>
>      Kaip sakant jei klientas turi savo kainas konkreciam miestui tai jas, jei tam miestui ner, bet yra aplamai kliento kaina, tada priskiriama ji, jeigu nera kliento kainu bet globalios kainos turi kainas tam miestui tai si kaina, jeigu nera siam miestui globalios kainos tada bendra kaina.
>
>
> Siuo momentu as darau taip:
>
> SELECT
>      kainosId,
>      CASE
>          WHEN K4.Id Is Not Null  THEN K4.Id
>          WHEN K3.Id Is Not Null THEN K3.Id
>          WHEN K2.Id Is Not Null THEN K2.Id
>          ELSE K1.Id END AS "priceId",
>     ......... kiti laukai....
> FROM
>      Siuntos S
> LEFT JOIN
>      SiuntuKainos K1 On K1.KlientasId = 0 And K1.MiestasId = 0 And S.Svoris BETWEEN K1.SvorisNuo And K1.SvorisId And ...kitos salygos...
> LEFT JOIN
>      SiuntuKainos K2 On K2.KlientasId = 0 And K2.MiestasId = S.MiestasId And S.Svoris BETWEEN K2.SvorisNuo And K2.SvorisId And ...kitos salygos...
> LEFT JOIN
>      SiuntuKainos K3 On K3.KlientasId = S.KlientasId And K3.MiestasId = 0 And S.Svoris BETWEEN K3.SvorisNuo And K3.SvorisId And ...kitos salygos...
> LEFT JOIN
>      SiuntuKainos K4 On K4.KlientasId = S.KlientasId And K4.MiestasId = S.MiestasId And S.Svoris BETWEEN K4.SvorisNuo And K4.SvorisId And ...kitos salygos...
>
>
> Tai vat, kokie pasiulymai optimizuoti si shmota? :)
>
> PS.
>      Viskas kaip ir veikia, tik dabar reikes dadeti kaina Nr 2 (Globalios miestu kainos), tai susimasciau gal cia ka eitu pagerinti?