Skocz do zawartości


Close Open
Close Open
Zdjęcie

Zestawienie SQL - odejmowanie dat


  • Please log in to reply
15 replies to this topic

#1 JarekM

JarekM

    Adept

  • Forumowicze
  • Pip
  • 4 Postów:

Napisany 23 wrzesień 2010 - 15:08

Witam wszystkich

Potrzebuję w zestawieniu SQL odjąć od siebie 2 daty. Wynik chciałbym uzyskać w liczbie dni.
Chciałbym również aby użytkownik wybierał sam okres zestawienia. Posłużyłem się zmiennymi globalnymi jednak zestawienie zwraca błąd, który tkwi w tym miejscu:

[roznica dni] = {WYBRANY_OKRES_DO} - {WYBRANY_OKRES_OD}

Różnica dni nie będzie pojawiała się w kolumnie. Będę jej używał do obliczenia zapasu.

Proszę o pomoc.

#2 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 24 wrzesień 2010 - 06:44

Różnicę dat zrealizujesz za pomocą datediff
select {WYBRANY_OKRES_OD},{WYBRANY_OKRES_DO},datediff(d, {WYBRANY_OKRES_OD},  {WYBRANY_OKRES_DO} ) as roznica
Jeżeli dobrze pamiętam to te zmienne występują w Rewizorze

Ale jeżeli chcesz, żeby użytkownik sam sobie wybierał okres to raczej nie zmienne globalne tylko kontrolki D lub DR
Sławek

#3 JarekM

JarekM

    Adept

  • Forumowicze
  • Pip
  • 4 Postów:

Napisany 24 wrzesień 2010 - 10:31

Ok dziękuję bardzo za pomoc. Faktycznie zmienne globalne nie działają tak jak myślałem.
Walczę ciągle z podanym niżej zestawieniem:

SELECT
tw__Towar.tw_Symbol AS [Symbol towatu],
tw__Towar.tw_Nazwa AS [Nazwa towaru],
tw_Stan.st_Stan AS [Aktualny stan],
Sum(dok_Pozycja.ob_Znak * dok_Pozycja.ob_Ilosc) AS [Ile sprzedane],
datediff(d, {D:Początkowa data:},  {D: Końcowa data:}) AS [Dni],
[Zapas na dni] = CASE WHEN Sum(dok_Pozycja.ob_Znak * dok_Pozycja.ob_Ilosc) = 0 THEN '0' 
             ELSE CASE WHEN Sum(dok_Pozycja.ob_Znak * dok_Pozycja.ob_Ilosc) IS NULL THEN '0' 
             ELSE tw_Stan.st_Stan / Sum(dok_Pozycja.ob_Znak * dok_Pozycja.ob_Ilosc) * datediff(d, {D:Początkowa data:},  {D: Końcowa data:}) END END

FROM tw__Towar
LEFT JOIN tw_Stan ON tw__Towar.tw_Id = tw_Stan.st_TowId
LEFT JOIN dok_Pozycja ON tw__Towar.tw_Id = dok_Pozycja.ob_TowId
LEFT JOIN dok__Dokument ON dok_Pozycja.ob_DokHanId = dok__Dokument.dok_Id

WHERE dok_datawyst between {D:Początkowa data:} and {D: Końcowa data:}
AND (dok__Dokument.dok_Typ IN({CHL:faktura sprzedaży#2#paragon#21#korekta faktury sprzedaży#6#zwrot detaliczny#14#:Typ dokumentu:2, 21, 6, 14: Cała sprzedaż}))

GROUP BY tw__Towar.tw_Symbol, tw__Towar.tw_Nazwa, tw_Stan.st_Stan

Zestawienie liczy zapas na określoną ilość dni biorąc pod uwagę sprzedaż z zadanego okresu.
Mam tylko problem z tym, że zestawienie pokazuje jedynie te towary które się sprzedały (bądź został wystawiony dokument wg filtra) w podanym okresie czasu. Chciałbym aby pokazywały się wszystkie towary a w kolumnie Ile sprzedane pojawiała się ilość sprzedana w ciągu okresu.

#4 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 24 wrzesień 2010 - 13:32

Bo nie uwzględniasz w "WHERE" tych towarów gdzie
dok_Pozycja.ob_TowId jest null

Sławek

#5 JarekM

JarekM

    Adept

  • Forumowicze
  • Pip
  • 4 Postów:

Napisany 24 wrzesień 2010 - 17:22

Hmmmmmmmmmmmm a można trochę więcej szczegółów? bo rozumiem że nie chodziło o to:
dok_Pozycja.ob_TowId IS NULL OR dok_datawyst between {D:Początkowa data:} and {D: Końcowa data:}

Proszę o dalsze wskazówki :-)

#6 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 24 wrzesień 2010 - 22:29

Oczywiście, że nie

Może podpowiem tak:

W głównym pytaniu towary i stan, w podzapytaniu dokument i pozycje(z sumowaną sprzedażą według ob_towid). Połącz ze sobą pytanie główne i pozdapytanie i wyciągnij potrzebne Ci dane

I jeszcze jedno:
Stosuj raczej
datediff(d, {D:Początkowa data:},  {D: Końcowa data:})+1 AS [Dni],
bo kiedy początek=koniec to ma być raczej 1 dzień a nie 0, nieprawdaż ?

Sławek

#7 JarekM

JarekM

    Adept

  • Forumowicze
  • Pip
  • 4 Postów:

Napisany 28 wrzesień 2010 - 16:10

Witam po krótkiej przerwie.
Niestety nadal nie mogę sobie poradzić z tym zestawieniem.

Nie wiem w jaki sposób zastosować Pańską sugestię (zapytanie i podzapytanie). Mogę otrzymać jakiś przykład?

#8 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 28 wrzesień 2010 - 18:41

Przykład:

SELECT t1.pole1, t1.pole2 AS towar, podzapytanie.podsumowanie
   FROM towary AS t1    	
   LEFT JOIN 
	(SELECT t2.pole1, SUM(t2.pole2) AS podsumowanie
              	FROM sprzedaz AS t2 GROUP  BY t2.pole1) AS podzapytanie 
                        	ON t1.pole1 = podzapytanie.pole1  

Sławek

#9 exequos@gmail.com

exequos@gmail.com

    Adept

  • Forumowicze
  • Pip
  • 5 Postów:

Napisany 06 październik 2010 - 10:46

Czy jest mozliwosc aby

ten raport byl generowany dla wybranych (select checkbox a nie z listy) magazynow

oraz zeby standardowo ustawiala sie data biezaca jako dzis-90 dni

?

#10 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 06 październik 2010 - 12:13

Czy jest mozliwosc aby
ten raport byl generowany dla wybranych (select checkbox a nie z listy) magazynow

Po pewnych przeróbkach jak najbardziej

oraz zeby standardowo ustawiala sie data biezaca jako dzis-90 dni


Na stan moich wiadomości to nie
Sławek

#11 exequos@gmail.com

exequos@gmail.com

    Adept

  • Forumowicze
  • Pip
  • 5 Postów:

Napisany 07 październik 2010 - 10:52

a zasugerowalbys kawalek kodu do tych magazynow? ;)

#12 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 11 październik 2010 - 15:27

Nie wiem o jaki kawałek Ci chodzi bo delikatnie rzecz biorąc to powyższe zestawienie raczej jest źle napisane.

Poniżej zestawienie pokazujące bieżący stan (nie uwzględnia rezerwacji ) na wybranych magazynach

Select
t.tw_Symbol AS [Symbol towaru],
t.tw_Nazwa AS [Nazwa towaru],
sum(s.st_Stan) AS [Aktualny stan na wybranych magazynach]

FROM tw__Towar t
LEFT JOIN tw_Stan  s ON t.tw_Id = s.st_TowId
where s.st_magid in ( {CHL_DB: SELECT mag_id, mag_symbol from sl_magazyn :wybierz magazyny})
group by t.tw_Symbol, t.tw_Nazwa

Sławek

#13 exequos@gmail.com

exequos@gmail.com

    Adept

  • Forumowicze
  • Pip
  • 5 Postów:

Napisany 20 październik 2010 - 13:48

super dziekuje za przyklad

a jaka formula dodac opcje wybrac magazyn "dowolny" ?

czy ten stan uwzglednia towary ze skutkiem wywolanym na magazynie zrodlowym?

#14 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 20 październik 2010 - 19:23

a jaka formula dodac opcje wybrac magazyn "dowolny" ?

{CHL_DB: SELECT mag_id, mag_symbol from sl_magazyn :wybierz magazyny:1,2,3,4,5,6:(dowolny)}


Liczby określają Id magazynów - aby zaznaczyć wszystkie należy wymienić wszystkie. NIESTETY.
Ja mam nadzieję, że ludziki z Insertu kiedyś zrobią coś z tym i dodadzą jakiś parametr ALL , * , czy cokolwiek innego, który określałby wszystkie ID.

Nie wiem co uważasz za

towary ze skutkiem wywolanym na magazynie zrodlowym


Stan pokazuje aktualny stan danego towaru na magazynie.
Jak napisałem wcześniej nie uwzględnia rezerwacji a tym bardziej nie uwzględnia tego, że są jakieś dokumenty z odłożonym skutkiem magazynowym zawierające dany towar.
Sławek

#15 exequos@gmail.com

exequos@gmail.com

    Adept

  • Forumowicze
  • Pip
  • 5 Postów:

Napisany 09 grudzień 2010 - 04:19

a zakladajac ze chcialoby sie miec w pierwszych dwoch kolumnach symbol i nazwe a w nastepnych magazyny i na przecieciu stan symbolu na magazynie...

probowalem cos takiego sklecic ale nie wiem czemu oblicza lacznie dla kazdego wiersza...

Select
t.tw_Symbol AS symbol,
t.tw_Nazwa AS nazwa,

(select (SUM(s.st_Stan) - SUM(s.st_StanRez)) from tw_Stan AS s  LEFT JOIN tw__Towar AS t ON s.st_TowId = t.tw_Id WHERE s.st_magid = 1) as mag1,
(select (SUM(s.st_Stan) - SUM(s.st_StanRez)) from tw_Stan AS s  LEFT JOIN tw__Towar AS t ON s.st_TowId = t.tw_Id WHERE s.st_magid = 2) as mag2

FROM tw__Towar AS t

group by t.tw_Symbol, t.tw_Nazwa


#16 birds22

birds22

    Entuzjasta

  • Forumowicze
  • PipPipPipPipPipPipPip
  • 1332 Postów:
  • Płeć:Mężczyzna
  • Lokalizacja:Zduńska Wola

Napisany 09 grudzień 2010 - 18:41

A dlaczego niby podzapytanie miałoby podać stan dla danego indeksu skoro nie ma w nim (w tym podzapytaniu) ani słowa o jaki towar Ci chodzi? Poza tym suma i grupowanie są też niepotrzebne bo pytasz (a raczej pytałbyś) o stan każdego indeksu osobno dla każdego magazynu.

A może lepiej zastosować konstrukcję
sum(CASE WHEN magazyn=1 THEN jakieś kolumny else 0 end) ?

http://msdn.microsof...y/ms181765.aspx
Sławek




0 Użytkowników czyta ten temat

0 użytkowników, 0 gości, 0 anonimowych użytkowników