Podkresle jeszcze raz, tak jak w poprzednim poscie: to moje pierwsze kroki w SQLu. Litosci
Popelnilem pewny zapytanie SQL, ktorego tresc jest zmanipulowanym przeze mnie wynikiem SQL Profilera dla zapytania, ktore baza dostaje kiedy uruchamiam zestawienie "Sprzedaz wedlug kontrahentow". Nie analizowalem CASE'ow i JOINow, tylko sklecilem cos takiego, zeby zamiast marzy otrzymac "narzut" czyli zysk/koszt. Usunalem tez niepotrzebne mi kolumny, dodalem troche Transact SQLa zeby moc wybierac zakres czasu i filtrowac po sl_GrupaKh.grk_Id.
Oto tresc zapytania:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
, Narzut = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
GROUP BY adr_Nazwa
Daje mi to co chce podejrzec.
Popelnilem tez drugie - bardzo podobne - zapytanie. Roznice sa wytluszczone:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
,
Narzut2 = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
AND tw__Towar.tw_IdGrupa NOT IN (9, 28)GROUP BY adr_Nazwa
Oba zapytania oddzielnie daja mi uzyteczne odpowiedzi. Mimo to, chcialbym niejako dodac kolumne "Narzut2" z drugiego zapytania - z uwzglednieniem tego dodatkowego argumentu w klauzuli WHERE - do mojego pierwszego zapytania tak, zeby w odpowiedzi na to pierwsze zapytanie w Subiekcie obok kolumny Narzut pojawila sie kolumna Narzut2 z wartosciami z drugiego zapytania.
Jak to polaczyc?
Subquery w klauzuli SELECT? Probowalem takiego:
SELECT
adr_Nazwa AS 'Nazwa'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END) AS 'Netto'
, SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END) AS 'Koszt'
, SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END) as 'Zysk'
, Narzut = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
, Narzut2 =
(
SELECT
Narzut2 = CONVERT(MONEY, CASE WHEN SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE ob_WartNetto * ob_Znak END)<>0 THEN (SUM(CASE WHEN (ob_TowRodzaj&16)>0 THEN 0 ELSE (ob_WartNetto-CASE WHEN (ob_TowRodzaj&6)>0 THEN 0 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id) END) * ob_Znak END)/SUM(CASE WHEN (ob_TowRodzaj&22)>0 THEN 1 ELSE dbo.fnZestSub_KosztSpr({D: od:} , ob_Id)*ob_Znak END))*100 ELSE 1 END )
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
AND tw__Towar.tw_IdGrupa NOT IN (9, 28)
)
FROM vwZstSprzWgKhnt
LEFT JOIN kh__Kontrahent ON dok_PlatnikId = kh_Id
LEFT JOIN adr__Ewid ON kh_Id = adr_IdObiektu
LEFT JOIN tw__Towar ON ob_TowId = tw_Id
LEFT JOIN sl_Kategoria ON dok_KatId = kat_Id
LEFT JOIN sl_GrupaKh ON kh_IdGrupa = grk_Id
WHERE
dok_Status <> 2 AND ((adr_TypAdresu = 1) OR (dok_PlatnikId IS NULL))
AND (dok_DataWyst BETWEEN {D: od:} AND {D: do})
AND (dbo.fnMAKE_DOKPARAM(dok_Typ, dok_Podtyp) IN (131072, 131074, 131075, 131076, 131077, 262144, 393216, 393217, 393218, 1376256, 1376257, 1376258, 1376259, 917504, 917505, 4063232, 4390912, 4390913, 4456448, 4521984)) AND (dok_MagId IN (1))
AND ob_TowRodzaj & 31 > 0
AND sl_GrupaKh.grk_Id IN ({DB: SELECT grk_Id, grk_Nazwa FROM sl_GrupaKh:Przedstawiciel})
GROUP BY adr_Nazwa
Niestety w kazdym wierszu kolumny Narzut2 podaje mi te sama wartosc.
Subquery w innej klauzuli, np FROM?