Witam,
Chcę przerobić jedno z wbudowanych zestawień (Sprzedaż wg kontrahentów i asortymentu) tak by wyliczał mi to zestawienie tylko dla towarów z określoną flagą.
I drugie pytanko: jak zastąpić te zmienne @DataDo, bo tego jak jest to subiekt nie przyjmie jako zestawienie własne SQL.
Profilerem wydłubałem coś takiego:
DECLARE @dataDo DATETIME
SET @DataDo = '20150924'
SELECT
adr_Nazwa = CASE
WHEN GROUPING(adr_Nazwa) = 1
THEN '(Razem sprzeda¿)'
ELSE ISNULL(adr_Nazwa, '(Kontrahent nieokreœlony)')
END,
grt_Nazwa = CASE
WHEN GROUPING(adr_Nazwa) = 1 THEN ''
WHEN GROUPING(adr_Nazwa) = 0 AND GROUPING(grt_Nazwa) = 1
THEN '(Razem kontrahent)'
ELSE ISNULL(grt_Nazwa, '(Grupa nieokreœlona)')
END,
tw_Nazwa = CASE
WHEN GROUPING(grt_Nazwa) = 1 THEN ''
WHEN GROUPING(grt_Nazwa) = 0 AND GROUPING(tw_Symbol) = 1
THEN '(Razem grupa)'
ELSE CASE
WHEN MAX(tw_Nazwa) IS NULL AND GROUPING(tw_Symbol)=0
THEN '(Us³uga jednorazowa)' ELSE MAX(tw_Nazwa)
END
END,
tw_Symbol = CASE
WHEN GROUPING(grt_Nazwa) = 1 THEN ''
WHEN GROUPING(grt_Nazwa) = 0 AND GROUPING(tw_Symbol) = 1
THEN '(Razem grupa)' WHEN tw_Symbol = ''
THEN '(Brak symbolu towaru)'
ELSE CASE
WHEN tw_Symbol IS NULL AND GROUPING(tw_Symbol)=0
THEN '(Us³uga jednorazowa)'
ELSE tw_Symbol
END
END,
SUM(ob_IloscMag * ob_Znak) as ob_IloscMag, tw_JednMiary = CASE
WHEN GROUPING(grt_Nazwa) = 1 THEN ''
WHEN GROUPING(grt_Nazwa) = 0 AND GROUPING(tw_Symbol) = 1 THEN ''
ELSE MAX(tw_JednMiary)
END,
SUM(ob_WartBrutto * ob_Znak) as ob_WartBrutto,
SUM(ob_WartNetto * ob_Znak) as ob_WartNetto,
SUM(CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr(@DataDo, ob_Id)*ob_Znak END) as ob_WartMag,
SUM((ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr(@DataDo, ob_Id) END) * ob_Znak) as Zysk, Marza = CONVERT(MONEY, CASE WHEN SUM(ob_WartNetto * ob_Znak)<>0 THEN (SUM((ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0.0000 ELSE dbo.fnZestSub_KosztSpr(@DataDo, ob_Id) END) * ob_Znak)/SUM(ob_WartNetto * ob_Znak))*100 ELSE 0.0000 END )
FROM
vwZstSprzWgKhnt
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_GrupaTw ON tw_IdGrupa = grt_Id
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr_Historia ON dok_PlatnikAdreshId = adrh_Id
LEFT JOIN adr__Ewid ON adrh_IdAdresu = adr_Id
WHERE
((adr_TypAdresu = 1) OR (dok_PlatnikAdreshId IS NULL))
AND (( (dok_DataWyst>='20150901') AND (dok_DataWyst<='20150924') )
AND (TypDlugi IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913))
AND (tw_Id IN (709,1269))
AND (dok_MagId IN (4, 1, 2, 3)))
AND ob_TowRodzaj & 15 > 0
GROUP BY adr_Nazwa, grt_Nazwa, tw_Symbol WITH ROLLUP
go
warunek: AND (( (dok_DataWyst>='20150901') AND (dok_DataWyst<='20150924') ) wiem, że mogę zastąpić
dok_DataWyst BETWEEN {DR:Data dokumentu:SELECT GETDATE():SELECT GETDATE()} Natomiast zmienna @DataDo jest wykorzystana jeszcze wcześniej w kodzie i nie wiem jak ją zastąpić, żeby była brana automatycznie z tego drugiego GETDATE().
A może da się to jakoś uprościć? bo zawsze będę chciał wyciągnąć zestawienie z pełnego miesiąca.