Zagnieżdżone SELECT

0

Mam zapytanie:

WITH T
	AS (
		SELECT 
		    CONVERT(VARCHAR(7), d.salesDate, 120) AS 'Rok-miesiąc sprzedaży',
			i.quantity AS 'Ilość',
			i.netAmount AS 'Wartość netto',
			ABS(i.realUnitPrice) AS 'Cena',
			c.code AS 'NrKlienta'
			FROM ps_apis_wrh_document d
		LEFT JOIN ps_apis_wrh_documentItem i ON d.id = i.idDocument		
		LEFT JOIN ps_apis_com_contractor c ON d.idContractor = c.id
		WHERE
			d.salesDate >= '09-01-2022'	AND d.salesDate <= '09-30-2022'
		)	
	
	
	SELECT 
  	    NrKlienta,
		Cena,
		sum([Ilość]) AS 'Ilość',
		sum([Wartość netto]) AS 'Wartość netto'		
	FROM T	
	GROUP BY [Rok-miesiąc sprzedaży],Cena, NrKlienta

Powstaje wynik:

NrKlienta;Cena;Ilość;Wartośćnetto            
XXX;1;10;100 
XXX;-1;-10;-100 
YYY;5;10;50

W tym przykładzie klient XXX po ponownym sumowaniu i grupowaniu wyników powinien zniknąć ponieważ jego suma Wartości netto = 0

Jak zmienić zapytanie by zniknął XXX? Kolejny select ?

0

Coś mi się nie zgadza, skoro w zapytaniu masz ABS(i.realUnitPrice) AS 'Cena', to jakim cudem select zwraca ujemna cene?
Która wersja SQL Servera?

0

Zapytanie nieco skróciłem, ale istotne jest, że w wyniku jest jak w tabeli.
Microsoft SQL Server Standard (64-bit) 13.0.7016.1

2

Możliwości masz kilka, możesz użyć window function:

WITH T
	AS (
		SELECT 
		    CONVERT(VARCHAR(7), d.salesDate, 120) AS 'Rok-miesiąc sprzedaży',
			i.quantity AS 'Ilość',
			i.netAmount AS 'Wartość netto',
			ABS(i.realUnitPrice) AS 'Cena',
			c.code AS 'NrKlienta',
            sum(i.netAmount) over (partition by c.code) as sumNetto
			FROM ps_apis_wrh_document d
		LEFT JOIN ps_apis_wrh_documentItem i ON d.id = i.idDocument		
		LEFT JOIN ps_apis_com_contractor c ON d.idContractor = c.id
		WHERE
			d.salesDate >= '09-01-2022'	AND d.salesDate <= '09-30-2022'
		)	
	
	
	SELECT 
  	    NrKlienta,
		Cena,
		sum([Ilość]) AS 'Ilość',
		sum([Wartość netto]) AS 'Wartość netto'		
	FROM T	
    WHERE sumNetto > 0
	GROUP BY [Rok-miesiąc sprzedaży],Cena, NrKlienta

Lub self join

SELECT
	NrKlienta,
	Cena,
	sum([Ilość]) AS 'Ilość',
	sum([Wartość netto]) AS 'Wartość netto'		
FROM 
	(select 
	    nrklienta NRK
	FROM
	    t
   GROUP BY 
	    nrklienta
	HAVING
		SUM([Wartość netto]) > 0
	) S
   INNER JOIN T ON S.NRK = T.NrKlienta
GROUP BY 
	[Rok-miesiąc sprzedaży]
	,Cena
	, NrKlienta
0

@Panczo: Jesteś genialny!

0

Wystarczy na końcu dodać HAVING :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1