Doszedłem do stanu gdy wynik wygląda mniej więcej tak:
A kod który za to odpowiada:
Kod: Zaznacz cały
WITH Transakcje
(TR_GIDNumer,
TR_GIDTyp,
TR_SpiNumer,
TR_SpiTyp,
TR_Dokument,
TR_Data,
TR_WartoscNetto,
TR_KosztNetto,
TR_MarzaK,
TR_MarzaP) AS
(
/* Wybieramy kolumny z TraElem i TraNag jak niżej */
SELECT
CDN.TraElem.TrE_GIDNumer,
CDN.TraElem.TrE_GIDTyp,
CDN.TraNag.TrN_SpiNumer,
CDN.TraNag.TrN_SpiTyp,
CDN.TraNag.TrN_DokumentObcy,
CDN.TraNag.TrN_Data3,
SUM(CDN.TraElem.TrE_KsiegowaNetto) AS Wartosc,
/* Sumujemy cenę netto elementów jako wartość netto transakcji */
SUM(CDN.TraElem.TrE_KosztKsiegowy) AS Koszt,
/* Sumujemy koszt elementów jako koszt transakcji */
(SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy)) AS MarzaK,
CASE
WHEN SUM(CDN.TraElem.TrE_KosztKsiegowy)=0 THEN 0
/* Zabezpieczamy się przed dzieleniem przez 0 gdy koszt nieustalony */
ELSE (SUM(CDN.TraElem.TrE_KsiegowaNetto) - SUM(CDN.TraElem.TrE_KosztKsiegowy))/(SUM(CDN.TraElem.TrE_KosztKsiegowy))*100
END AS MarzaP
FROM
CDN.TraElem INNER JOIN CDN.TraNag ON
(CDN.TraElem.TrE_GIDTyp = CDN.TraNag.TrN_GIDTyp) AND (CDN.TraElem.TrE_GIDNumer = CDN.TraNag.TrN_GIDNumer)
/* Warunek łaczenie TraNag i TraElem po GIDTyp i GIDNumer */
WHERE
CDN.TraNag.TrN_Stan<>6 AND
/* Wykluczamy dokumenty anulowane */
(CDN.TraElem.TrE_GIDTyp=2033 AND CDN.TraNag.TrN_SPITyp=2033 AND CDN.TraNag.TrN_SpiNumer<>0) OR
/* Bierzemy pod uwagę dokumenty FS */
(CDN.TraElem.TrE_GIDTyp=2001 AND CDN.TraNag.TrN_SPITyp=2033 AND CDN.TraNag.TrN_SpiNumer<>0)
/* Bierzemy pod uwagę dokumenty WZ posiadające spinacz (S)FS */
GROUP BY
CDN.TraElem.TrE_GIDNumer,
CDN.TraElem.TrE_GIDTyp,
CDN.TraNag.TrN_SpiNumer,
CDN.TraNag.TrN_SpiTyp,
CDN.TraNag.TrN_DokumentObcy,
CDN.TraNag.TrN_Data3
)
SELECT
TR_GIDNumer,
TR_GIDTyp,
TR_SpiNumer,
TR_SpiTyp,
TR_Dokument,
TrN_DokumentObcy,
CONVERT( char(10),DATEADD(dd, TR_Data, '18001228' ), 104 ) AS 'Data sprzedaży',
(STR(TR_WartoscNetto, 10, 2) + ' zł') AS 'Wartość netto',
(STR(TR_KosztNetto, 10, 2) + ' zł') AS 'Koszt zakupu',
(STR(TR_MarzaK, 10, 2) + ' zł') AS 'Marża kwota',
CASE WHEN TR_MarzaP<>0 THEN (STR(ROUND(TR_MarzaP, 0), 10, 2) + ' %')
ELSE (LEFT(TR_MarzaP, 0) + 'Brak kosztu')
END AS 'Marża procent'
FROM Transakcje JOIN CDN.TraNag ON
(TR_SpiTyp=TrN_GIDTyp) AND (TR_SpiNumer=TrN_GIDNumer)
ORDER BY
Transakcje.TR_Data