Forum Użytkownikow Subiekt GT
InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: Paweł Em w Kwiecień 13, 2021, 16:31:21
-
Hej wszystkim
Mam problem ponieważ nie potrafię znaleźć tabeli w sql która odpowiada w subiekcie za wielkość sprzedaży(coś jak zestawienie "sprzedaż wg asortymentu"W zapytaniu do którego chcę dodać taką tabelę , mam już stan magazynowy, a zamysł jest taki żęby w excelu porównać których towarów jest mniej na stanie niż sprzedało się w ciągu ostatniego miesiąca i w łatwy sposób zlecić je do produkcji... :)
-
Najlepiej wykorzystać widok vwZstSprzedWgKhnt
-
Wybacz nie potrafię zastosować Twojego rozwiązania.
Generalnie stworzyłem swój własny program do zlecania na produkcję, z subiekta pobieram tylko dane. Jedyne co chciałbym dodać to właśnie kolumnę która pokaże mi ile której pozycji się sprzedaje, a w excelu zrobię sobie formatowanie warunkowe i będzie mi pokazywać te pozycje których pozycji jest mniej na stanie niż mogłoby być co wyniknie z różnicy pomiędzy stanem a sprzedażą. Birds22 wybacz moją mała wiedzę, jednak staram się jak mogę żeby uprościć swoją pracę
SELECT Towar.tw_IdGrupa , Towar.tw_Symbol, Towar.tw_Nazwa, Stan.st_Stan
FROM tw__Towar TOWAR
inner join tw_Stan as STAN ON tw_Id = st_TowId
WHERE tw_Zablokowany = 0 AND st_MagId = 1 AND tw_Rodzaj = 8 AND tw_IdGrupa IN(1,4)AND tw_Nazwa NOT LIKE 'ści%'
AND tw_Nazwa NOT LIKE 'wyk%' ORDER by tw_Symbol
-
Zawsze możesz skorzystać z profilera i podsłuchać wbudowane zapytanie - zmienić ich strukturę i uzyskać oczekiwany rezultat.
-
Tabelę będziesz musiał aktualizować, a widok daje zawsze aktualne dane.
-
Informacja dla mnie potrzebna znajduje się w tabeli dok_Pozycja w ob_ilosc?
Nie znam się na tym co próbuje zrobić lecz wiem że mi to ułatwi pracę....
Ma ktoś jakiś pomysł? PS nie czekam na gotowe rozwiązanie sam próbuję ale póki co bez sukcesu.
Pozdrawiam
-
Udało mi się zrobić to zapytanie w inny sposób, lecz teraz nie umiem połączyć tych dwóch zapytań z racji słabej wiedzy. Jest może ktoś kto mógłby mi pomóc? Chodzi o to że wynik ponższego zapytania chciałbym mieć w zapytaniu powyżej
SELECT tw__Towar.tw_Symbol AS SYMBOL, SUM(dok_Pozycja.ob_Ilosc) as sprzedaZ
FROM dok__Dokument
INNER JOIN dok_Pozycja ON dok_Pozycja.ob_DokHanId = dok__Dokument.dok_Id
INNER JOIN tw__Towar ON dok_Pozycja.ob_TowId = tw__Towar.tw_Id
INNER JOIN tw_Stan ON tw__Towar.tw_Id = tw_Stan.st_TowId
WHERE tw_Zablokowany = 0 and dok__Dokument.dok_Typ = 2 and tw_Rodzaj = 8 and st_magid = 1 AND tw_IdGrupa IN(1,4)AND tw_Nazwa NOT LIKE 'ści%' AND tw_Nazwa NOT LIKE 'wyk%'
GROUP BY tw_Symbol, tw_JednMiary
ORDER BY tw_Symbol
-
Panowie tak mnie zmotywowało wstawianie tu na grupę, że sam sobie poradziłem. Została ostatnia rzecz (zapewne prosta)a mianowicie co mam zrobić żeby w kolumnie SUM(dok_Pozycja.ob_Ilosc) brał pod uwagę tylko ostatnie 30 dni?
SELECT tw_IdGrupa, tw_Symbol,tw_Nazwa,st_Stan, tw_JednMiary, SUM(dok_Pozycja.ob_Ilosc)as sprzedaż, ob_Jm, tc_CenaNetto7, tc_CenaBrutto7,TowarSkladnikiKompletu = (
STUFF (
(
SELECT
'|' + (SELECT tw_Symbol FROM tw__Towar WHERE tw_Id = KPL.kpl_IdSkladnik) + 'x' + CAST(KPL.kpl_Liczba AS VARCHAR(MAX))
FROM
tw_Komplet KPL
JOIN tw__Towar on kpl_IdKomplet = tw_Id
WHERE
tw_Id = tw_Id FOR XML PATH ('')
),
1,
1,
''
)
)
FROM dok__Dokument
INNER JOIN dok_Pozycja ON ob_DokHanId = dok_Id
INNER JOIN tw__Towar ON ob_TowId = tw_Id
INNER JOIN tw_Cena CENA ON tw_Id = tc_Id
INNER JOIN tw_Stan ON tw_Id = st_TowId
WHERE tw_Zablokowany = 0 AND st_MagId = 1 AND tw_Rodzaj = 8 AND tw_IdGrupa IN(1,4) AND tw_Nazwa NOT LIKE 'ści%' AND tw_Nazwa NOT LIKE 'wyk%'
GROUP BY tw_IdGrupa, tw_Symbol,tw_Nazwa,st_Stan, tw_JednMiary, ob_Jm, tc_CenaNetto7,tc_CenaBrutto7
ORDER BY tw_Symbol
-
Uprościłem całe zapytanie ponieważ zmieniłem trochę koncepcję. W całym zapytaniu chcę osiągnąć wyświetlenie wszystkich rekordów(grupa,symbol,nazwa,bieżący stan magazynowy oraz ilość sprzedana w ostatnich 30 dniach).
Teraz tak właśnie jest z jednym wyjątkiem, mianowicie pokazuje mi tylko rekordy dla których w ostatnich 30dniach była jakakolwiek sprzedaż, a ja chciałbym widzieć także te dla których nie było żadnej. Czy jest to w ogóle możliwe?
Czy mogę liczyć na pomoc któregoś z forumowiczów? P.s nie idę na łatwiznę bo jak widać sam bez pomocy dokonałem postępu. Bardzo proszę o pomoc :)
SELECT tw_IdGrupa, tw_Symbol,tw_Nazwa,st_Stan, SUM(dok_Pozycja.ob_Ilosc)as sprzedaż_miesieczna, ob_Jm
FROM dok__Dokument
INNER JOIN dok_Pozycja ON ob_DokHanId = dok_Id
INNER JOIN tw__Towar ON ob_TowId = tw_Id
INNER JOIN tw_Stan ON tw_Id = st_TowId
WHERE dok_DataWyst <= getdate() and dok_DataWyst >= dateadd(day,-30,getdate()) AND dok__Dokument.dok_Typ = 2 AND tw_Zablokowany = 0 AND st_MagId = 1 AND tw_Rodzaj = 8 AND tw_IdGrupa IN(1,4) AND tw_Nazwa NOT LIKE 'ści%' AND tw_Nazwa NOT LIKE 'wyk%'
GROUP BY tw_IdGrupa, tw_Symbol,tw_Nazwa,st_Stan, ob_Jm
ORDER BY tw_Symbol
-
Musisz wyjść od tw__towar.
Najprościej (niekoniecznie najwydajniej):
Zrób sobie
SELEC tw.tw_nazwa, sp.sprzedaż_miesieczna
FROM tw__towar tw
LEFT JOIN
(
tu zapytanie które przygotowałeś wcześniej, ale został tylko dok__Dokument i dok_pozycja, JOINY do tw__towar i tw_stan usuń (co za tym idzie z WHERE usuń warunki z tych tabel), a w SELECT zostaw tylko id towaru i sprzedaż
) sp
[ tutaj te dodatkowe JOINY i warunki]
Jak zagmatwałem to pytaj :).
Swoją drogą: skorzystanie z widoku o którym wspominał birds22 jest lepszym pomysłem niż korzystanie z tego zapytania które stworzyłeś, ponieważ jeżeli korzystasz z faktur zbiorczych wyniki mogą być błędne.
-
Niestety, nie posługuję się SQL-em ,staram się tylko ułatwić swoją pracę, utknąłem w miejscu. Nie wiem co mam zrobić, żeby osiągnąć końcowy rezultat...
Generalnie potrzebuję wszystkie te kolumny z selecta do dalszej pracy naa nich w excelu... Poniższe zapytanie oparte na pomocy tomaszf funkcjonuje źle, pokazuje tylko 417 rekordów z 6300. Ma ktoś jakąś wskazówkę?
Select tw_IdGrupa,tw_Symbol,tw_Nazwa,st_Stan,SUM(dok_Pozycja.ob_Ilosc)as sprzedaż_miesieczna, ob_Jm
From tw__Towar
LEFT JOIN dok__Dokument ON tw_Id = dok_id
LEFT JOIN dok_Pozycja ON dok_Id = ob_TowId
JOIN tw_Stan ON tw_Id = st_TowId
WHERE dok_DataWyst <= getdate() and dok_DataWyst >= dateadd(day,-30,getdate()) AND dok__Dokument.dok_Typ = 2 AND tw_Zablokowany = 0 AND st_MagId = 1 AND tw_Rodzaj = 8 AND tw_IdGrupa IN(1,4) AND tw_Nazwa NOT LIKE 'ści%' AND tw_Nazwa NOT LIKE 'wyk%'
GROUP BY tw_IdGrupa, tw_Symbol,tw_Nazwa,st_Stan , ob_Jm
ORDER BY tw_Symbol
-
Nie znasz SQL to zamów, zyskasz od cholery czasu. Ale oczywiście jak chcesz.
Nie będę analizował całości ale ten kawałek
From tw__Towar
LEFT JOIN dok__Dokument ON tw_Id = dok_id
LEFT JOIN dok_Pozycja ON dok_Id = ob_TowId
to jest jakaś masakra totalnie bez zrozumienia.
Powinno być:
From tw__Towar
LEFT JOIN dok_Pozycja ON tw_Id = ob_TowId
LEFT JOIN dok__Dokument ON ob_dokHanId = dok_id
-
CANDY MASZ RACJĘ NA DRUGI RAZ ZLECĘ KOMUŚ I ZAOSZCZĘDZE CZAS..... Jednak teraz już tyle nad tym spędziłem, że muszę to dokończyć.Poprawiłem połączenia wedle Twojej sugestii. Wszystko działa dobrze poza jednym małym szczegółem, mianowicie zapytanie teraz pokazuje tylko rekordy dla których była sprzedaż w ciągu ostatnich 30dni a ja chciałbym żeby pokazywało wszystkie rekordy. Ma ktoś jakiś pomysł?
SELECT
TOWAR.tw_IdGrupa,TOWAR.tw_Symbol,TOWAR.tw_Nazwa,STAN.st_Stan,SUM(dok_Pozycja.ob_Ilosc)as sprzedaż_miesieczna,tw_JednMiary
FROM tw__Towar TOWAR
inner join tw_Stan as STAN ON tw_Id = st_TowId
LEFT JOIN dok_Pozycja ON tw_Id = ob_TowId
LEFT JOIN dok__Dokument ON ob_dokHanId = dok_id
WHERE dok_DataWyst <= getdate() and dok_DataWyst >= dateadd(day,-30,getdate()) AND tw_Zablokowany = 0 AND st_MagId = 1 AND tw_Rodzaj = 8 AND tw_IdGrupa IN(1,4) AND tw_Nazwa NOT LIKE 'ści%' AND tw_Nazwa NOT LIKE 'wyk%'
GROUP BY tw_IdGrupa, tw_Symbol,tw_Nazwa,st_Stan ,tw_JednMiary
ORDER by tw_Symbol
-
CANDY MASZ RACJĘ NA DRUGI RAZ ZLECĘ KOMUŚ I ZAOSZCZĘDZE CZAS.....
Stanowczo zleć, bo działasz zupełnie po omacku ;)
Tu masz warunek na daty (napisany tyłem do przodu, ale działa)
WHERE dok_DataWyst <= getdate() and dok_DataWyst >= dateadd(day,-30,getdate()) AND tw_Zablokowany...
bardziej zrozumiała forma byłaby moim zdaniem taka
WHERE
dok_DataWyst >= dateadd(day,-30,getdate()) AND dok_DataWyst <= getdate()
AND tw_Zablokowany...
Pierwszy warunek mówi że data ma być nie wcześniejsza niz 30 dni wstecz, a drugi że nie późniejsza niż dziś.
Jak dasz
WHERE
dok_DataWyst <= getdate()
AND tw_Zablokowany
To będą wszystkie (poza przyszłymi) a jeśli przyszłe nie stanowią problemu to wywal wszystko między WHERE i tw_Zablokowany
-
CANDY, oczywiście masz rację jednak potrzebuję żeby były wszystkie z ostatnich 30dni :) Proszę pomóż mi zakończyć moje wypociny z tym zapytaniem, a na przyszłość zlecę i zapłacę z uciechą zaoszczędzenia czasu. Na pewno nauczyło mnie to zapytanie pokory.
-
CANDY, oczywiście masz rację jednak potrzebuję żeby były wszystkie z ostatnich 30dni :) Proszę pomóż mi zakończyć moje wypociny z tym zapytaniem, a na przyszłość zlecę i zapłacę z uciechą zaoszczędzenia czasu. Na pewno nauczyło mnie to zapytanie pokory.
To zapytanie w ogóle sprawdzi się tylko w szczególnych przypadkach, bo nie będzie poprawnie liczyło sprzedaży z faktur zbiorczych, ani zaliczkowych, nie będzie pomijało faktur detalicznych ani unieważnionych.
Sprawdzi się dobrze tylko na zwykłych fakturach.
Na dodatek warunek dla daty jest niedobry, bo GETDATE() daje wynik z minutami a GT nie zapisuje czasu, więc na krawedziach przedziału będą błędy.
Biorąc to wszystko pod uwagę poprawione SELECT wygląda tak (świadomie wybrałeś tylko komplety, prawda?)
SELECT T.tw_IdGrupa, T.tw_Symbol, T.tw_Nazwa, ST.st_Stan, Sprzedaz_miesieczna = ISNULL(SP.Sprzedaz, 0)
FROM tw__Towar T
INNER JOIN tw_Stan ST ON ST.st_TowId = T.tw_Id AND ST.st_MagId = 1
LEFT JOIN (
SELECT ob_TowId, Sprzedaz = SUM(dok_Pozycja.ob_Ilosc)
FROM
dok_Pozycja
LEFT JOIN dok__Dokument ON ob_DokHanId = dok_id
WHERE
dok_DataWyst BETWEEN DATEADD(day,-30,getdate()) AND GETDATE()
AND dok_Typ = 2
AND dok_MagId = 1
AND ob_TowRodzaj = 8
GROUP BY ob_TowId
) SP ON T.tw_Id = SP.ob_TowId
WHERE
T.tw_Zablokowany = 0
AND T.tw_Rodzaj = 8
AND T.tw_IdGrupa IN(1,4)
AND T.tw_Nazwa NOT LIKE 'ści%'
AND T.tw_Nazwa NOT LIKE 'wyk%'
ORDER BY T.tw_Symbol
Jakby co to zwróć uwagę że warunek na rodzaj i magazyn występuje dwa razy.
A jakbyś chciał zestawienie, które wyliczy wszystko jak należy to juz zapraszam na PW, bo to trochę więcej dłubania.
-
Candy dziękuję Ci bardzo. Tak świadomie wybrałem tylko komplety. Jak będę potrzebował cokolwiek z SQL to pierwsze miejsce gdzie się będę zgłaszał to Twój priv.$
I tak jeszcze napisze ku przestrodze dla innych użytkowników, jeżeli myślicie że chwilę poczytacie i gdzieś Wam tam dzwoni, to żeby nie marnować czasu trzeba to zadanie oddelegować ludziom którzy są biegli w tej dziecinie czyli min. użytkownik CANDY.