T-SQL suma przyrostowa

0

Witam,
Zbudowałem zapytanie, które wyświetla sumę liczb pogrupowaną po dniach.
Chciałem przerobić to zapytanie tak aby była to suma przyrostowa, niby wszystko się udało, tylko nie dostaję jednego rekordu na dzień a sporo więcej. Co robię źle ?

SELECT
	CAST(SUM(CASE WHEN SD.OPERACJA = 'P' THEN (DMP.ILOSC * DMP.CENA) ELSE -(DMP.ILOSC * DMP.CENA_ZAKUPU) END) OVER(ORDER BY DATA) AS decimal(10, 2)) STAN_MAG
	,CONVERT(date,DM.DATA_WYSTAWIENIA,120) DATA
FROM DOK_MAGAZYNOWE DM
	JOIN DOK_MAGAZYNOWE_POZ DMP ON DM.ALT_DOK_MAG = DMP.ALT_DOK_MAG
	JOIN SL_DOKUMENTOW SD ON SD.SYMBOL_KWITU = DM.SYMBOL_KWITU
WHERE ID_MAGAZYNU = '11' AND CZY_TMP = 'N'
--GROUP BY DATA

Otrzymany wynik:

STAN_MAG DATA
47965.68 2011-01-15
47965.68 2011-01-15
47965.68 2011-01-15
47965.68 2011-01-15
...
894034.53 2016-02-10
894034.53 2016-02-10
894034.53 2016-02-10

0

Bez wglądu do danych obstawiam, że któryś z tych joinów to sprawia...

edit:

To w sumie oczywiste, datę masz z "nagłówka" reszta to pozycje. Z sumuj najpierw wartości dla dat a później na podstawie tego zrób sume narastającą:

select
	DATA,
	CAST(SUM(STAN) OVER(ORDER BY DATA) AS DECIMAL(10, 2)) STAN_MAG
FROM (
	SELECT Sum(CASE 
				 WHEN SD.operacja = 'P' THEN ( DMP.ilosc * DMP.cena ) 
				 ELSE -( DMP.ilosc * DMP.cena_zakupu ) 
			   END)                                STAN, 
		   CONVERT(DATE, DM.data_wystawienia, 120) DATA 
	FROM   dok_magazynowe DM 
		   JOIN dok_magazynowe_poz DMP 
			 ON DM.alt_dok_mag = DMP.alt_dok_mag 
		   JOIN sl_dokumentow SD 
			 ON SD.symbol_kwitu = DM.symbol_kwitu 
	WHERE  id_magazynu = '11' 
		   AND czy_tmp = 'N' 
	GROUP  BY CONVERT(DATE, DM.data_wystawienia, 120) ) DT
0

Bardzo dziękuję za pomoc, na Microsoft SQL 2012(SP1) działa jak należy.
Dane muszę też zebrać z Microsoft SQL 2005, a on z funkcją CONVERT sobie nie radzi. Jak można to ominąć ?

0

Nie jest problemem funkcja convert tylko typ do którego konwertujesz. SQL 2005 nie ma typu date.
Dodatkowo ten sposób nie zadziala w wersji 2005, ponieważ ORDER BY w OVER doszedl w wersji 2012

0

Auć :/
Można temat ugryźć z innej strony ?
W ostateczności mogę to wyliczyć już na poziomie PHP, ale fragment przedstawionego zapytania miał być częścią większej całości.

0

Mozesz konwertować do datetime.

sposobów na sumy bieżące jest kilka: http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sql-server

Następnym razem zaczynaj pisanie dla najniższej wspieranej wersji...

0

Zapytanie zbudowane, zgodne z Microsoft SQL 2005.
Kiedy wywołuję je przez SQL Server Menagment Studio wszystko działa.
Kiedy PHP->PDO wywołuję dokładnie to samo zapytanie nie zwraca mi żadnego wyniku.
Kod po części zwinięty ale prezentuje się tak:

DECLARE @sumowanie TABLE (DATA DATETIME, PRZYROST float, STAN float);
INSERT INTO @sumowanie(data, przyrost)
	SELECT
		CONVERT(varCHAR(5),YEAR(DM.DATA_WYSTAWIENIA))+'-'+right('0'+CONVERT(varCHAR(3),month(DM.DATA_WYSTAWIENIA)),2)+'-'+right('0'+CONVERT(varCHAR(3),day(DM.DATA_WYSTAWIENIA)),2) DATA
		,SUM(CASE WHEN SD.operacja = 'P' THEN ( DMP.ilosc * DMP.cena ) ELSE -( DMP.ilosc * DMP.cena_zakupu ) END) STAN FROM dok_magazynowe DM 
			JOIN dok_magazynowe_poz DMP ON DM.alt_dok_mag = DMP.alt_dok_mag JOIN sl_dokumentow SD ON SD.symbol_kwitu = DM.symbol_kwitu
	WHERE  id_magazynu = '7' AND czy_tmp = 'N' GROUP BY CONVERT(varCHAR(5),YEAR(DM.DATA_WYSTAWIENIA))+'-'+right('0'+CONVERT(varCHAR(3),month(DM.DATA_WYSTAWIENIA)),2)+'-'+right('0'+CONVERT(varCHAR(3),day(DM.DATA_WYSTAWIENIA)),2) ORDER BY DATA
DECLARE @stan float SET @stan = 0 UPDATE @sumowanie SET @stan = STAN = @stan + PRZYROST FROM @sumowanie
SELECT DATA, STAN FROM @sumowanie

Co może być przyczyną ?

0

Stawiam na średnik. :) QA obsługuje całe zaznaczone zapytanie, a PDO chyba do średnika.

0

Nie jestem specem od PHP i PDO ale zastanawiałbym się nad nextrowset lub ubranie zapytania w SET NOCUONT

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