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?
0
0
Przejrzyj ten topic. Myślę, że tam masz odpowiedź.
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
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