Podzapytanie na podstawie dat [TSQL]

0

Witam,
mam zapytanko, które zwraca wynik jak poniżej..
Chciałbym z innej tabeli pobrać obroty na podstawie dat dla wierszy 4-3, 3-2, oraz 2-1.
Próbowałem już zapytań skorelowanych oraz funkcji [mag,dataod, datado] (nie wiem jak pobrać datę z drugiej linii).
Wydaje się to łatwe, ale gdzieś popełniam błąd ;[
Jakie rozwiązanie proponujecie?
screenshot-20170420141442.png

0

Przejrzyj ten topic. Myślę, że tam masz odpowiedź.

ROW_NUMBER i podzapytanie

0

Która wersja bazy, pokaż SQL-a

0

Wersja 12. SQL dość duży, ale może wymyślimy coś lepszego bo teraz pakuje to do #tmp i dopiero tam łącze.
Oparłem się na tym SQL - czasy pomiędzy wejściami i wyjściami.
Czy nie wystarczy zjoinować tę samą tabelę +1 wiersz i już mamy obie daty w tym samym wierszu :)
Do tego funkcja i powinno hulać (chyba, że coś szybszego może być, ale funkcję już mam sklepaną)


select MAG_GIDNumer,
reg,
alles.MAG_Kod,
alles.data,
alles.ilosc,
alles.koszt,
cast(GETDATE()-alles.data as int) dodzis 
,alles.wier

from
(
select 
inwnt.reg,MAG_GIDNumer,
MAG_Kod,
inwnt.data,
sum(inwnt.szt)ilosc,
sum(inwnt.koszt) koszt,
cast(GETDATE()-inwnt.data as int) dodzis,
ROW_NUMBER() OVER(PARTITION BY  inwnt.reg,mag.mag_kod ORDER BY inwnt.data DESC ) wier 
from
(
select 
case when a.TrN_GIDTyp=1617 then 'PW'
when a.TrN_GIDTyp=1616 then 'RW' end typ,
convert(varchar(11),dateadd(d,a.TrN_Data3,'18001228'),111)data,
cdn.NumerDokumentuTrn(a.TrN_GIDTyp,a.TrN_SpiTyp,a.TrN_TrNTyp,a.TrN_TrNNumer,a.TrN_TrNRok,a.TrN_TrNSeria) as dok,
cast(case when Tre_GidTyp=1616 then sum(tre_ilosc)*-1 else sum(tre_ilosc) end as int) as szt, 
cast(case when tre_gidtyp=1616 then sum(tre_ksiegowanetto)*-1 else sum(tre_ksiegowanetto) end as float) as koszt,
 MAG_Opis reg,
case 
when trn_magznumer=8 then 123 
when trn_magznumer=31 then 140 
when trn_magznumer=11 then 144
when trn_magznumer=10 then 147
when trn_magznumer=6 then 151
else trn_magznumer end  as mag_numer 
  from cdn.TraNag a
	join cdn.traelem on a.TrN_GIDNumer=tre_gidnumer and a.TrN_GIDTyp=TrE_GIDTyp
	join cdn.TwrKarty on TrE_TwrNumer=Twr_GIDNumer
	join cdn.magazyny on MAG_GIDNumer=a.TrN_MagZNumer
  where (  TrN_GIDTyp in (1616,1617)) and TrN_trnrok>=YEAR(getdate())-2
	 and TrN_MagZNumer not in (1,9,44,66,116,102,13,18)
	--and MAG_Zablokowany=0 
	and MAG_Wewnetrzny=1
group by case when a.TrN_GIDTyp=1617 then 'PW'
when a.TrN_GIDTyp=1616 then 'RW' end, a.TrN_Data3,mag_kod,tre_gidtyp,MAG_Opis,
case 
when trn_magznumer=8 then 123 
when trn_magznumer=31 then 140  
when trn_magznumer=11 then 144
when trn_magznumer=10 then 147
when trn_magznumer=6 then 151
else trn_magznumer end ,
cdn.NumerDokumentuTrn(a.TrN_GIDTyp,a.TrN_SpiTyp,a.TrN_TrNTyp,a.TrN_TrNNumer,a.TrN_TrNRok,a.TrN_TrNSeria)  
)inwnt 
join 
(
select mag_gidnumer, mag_kod, mag_opis
	from cdn.Magazyny
)mag on mag.MAG_GIDNumer=inwnt.mag_numer
group by data, MAG_Kod,reg,MAG_GIDNumer
)alles

Pakuje to do tymczasowej #inwentury i..

select a.*,b.data,funkcja (a.maggid,a.wier,b.data,a.data)
from #inwentury a
join #inwentury b on a.maggid=b.maggid and b.wier =a.wier+1

screenshot-20170420153101.png
Pewnie można szybciej prościej bez tymczasowej?

1

czy tymczasowa czy cte:

select *,funkcja(maggid,wier,dataod,data)
from (
select
    *
    ,LEAD(data, 1,null) OVER (ORDER BY wier)  as dataOd
from
    #inwentaury)
0

Piękne dzięki.. przydatne funkcje lag i lead

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