GTR0123 Ответов: 2

Баланс вычисляют получая какие то странные цифры посередине


У меня есть этот код для расчета баланса но он плохо работает beacouse иногда он плюсуется somtimes следующее значение например я покажу вам код и вывод plz помогите мне решить эту проблему
Выход:
ID       Date       Operation Amount Balance
2979    07-03-2018  Cash Out  6.9   -44.88
2989    09-03-2018  Cash In   19    -25.88
2980    09-03-2018  Cash In   8.09  -17.79
2996    09-03-2018  Cash Out  98.57 -25.88
2986    09-03-2018  Cash Out  1.3   -27.18
2988    09-03-2018  Cash Out  4     -31.18
2981    09-03-2018  Cash Out  8.09  -129.75

Вот что я вижу, когда баланс равен -44.88 это плюс 19 и получение 25.88 это нормально, тогда -25.88 плюс 8.09 и получение -17.79 это правда, но тогда он должен быть минус 98.57, но вместо этого он Минус 8.09 prev one можете ли вы мне помочь?

Что я уже пробовал:

DECLARE @Datest DATE
declare @dateend DATE   
SET @Datest='2018-02-1 00:00:00'
SET @dateend='2018-12-14 06:54:42'

DECLARE @DateStart DATE='2017-01-01 00:00:00'; 

WITH cte 
     AS (SELECT  id = Row_number() OVER(ORDER BY date,(CASE WHEN Op_Type_Id=1 OR Op_Type_Id=3 OR Op_Type_Id=5  THEN 1 ELSE 0 END)DESC),
     x.ID AS iid,
                x.Date AS [Date],dbo.Op_type.Type as Operation,Op_Type_Id,
                dbo.Source.Source as Source,j.Source AS Recipient,
                dbo.Expence_Items.Name AS Purpose,dbo.Expence_Items.Name_En AS Purpose_EN,
                dbo.Expence_Items.Name_Rus AS Purpose_Ru,dbo.Executor.Name AS Executor, 
                x.Value as AmountGel,
 x.Note 
         FROM   [dbo].[Reestr] x LEFT JOIN dbo.Source AS j ON x.Sender_Id2=j.ID 
         LEFT JOIN dbo.Expence_Items ON x.Expence_Id = dbo.Expence_Items.ID 
         LEFT OUTER JOIN dbo.Source ON x.Sender_Id = dbo.Source.ID 
         LEFT JOIN  dbo.Executor ON x.Executor_Id = dbo.Executor.ID 
         LEFT OUTER JOIN dbo.Op_type ON x.Op_Type_Id = dbo.Op_type.ID 

         WHERE  DATE >= @DateStart) 
SELECT  
    id,FORMAT([Date],'dd-MM-yyyy') AS [Date],Operation,Source,Amount,
       Balance= (select(sum(case when Op_Type_Id IN (1,3,5)
            then CAST(Amount AS NUMERIC(6,2)) when Op_Type_Id IN(2,4,6) then(0-CAST(Amount AS NUMERIC(6,2))) END))
                    FROM cte
                       WHERE  id < a.id or id=a.id ),Note
FROM   cte AS a WHERE ([Date]>=@Datest AND [Date]<=@dateend)
ORDER  BY FORMAT([Date],'yyyy-MM-dd')

CHill60

"Где ID &ЛТ; а.ID или идентификатор=а.ИД ),обратите внимание" - что производит синтаксическую ошибку. Что такое фактический код?

GTR0123

вы можете сделать где ID &ЛТ; а.код ) есть.идентификатор с идентификатором КТР

CHill60

Прошу прощения, что пропустил подзапрос.

2 Ответов

Рейтинг:
4

GTR0123

SELECT  x.Value ,SUM((case when Op_Type_Id IN(1,3,5)
			then Value when Op_Type_Id IN (2,4,6) then(0-Value) END)) OVER(ORDER BY x.[Date]
     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) 
          AS Balance
         FROM   [dbo].[aaa] x LEFT JOIN  
		 LEFT OUTER JOIN dbo.Op_type ON x.Op_Type_Id = dbo.Op_type.ID 
		  WHERE  (x.[date]>'(start date)for example:'2016-01-01 00:00:00'' )
 ORDER BY x.[Date]


я создал таблицу tmp с теми же столбцами value balance и date если вы хотите у вас тоже может быть id после того как я использовал этот код для
insert
и после этого я запускаю select form TMP table и использую
when [Date2]>=@Datest AND [Date2]<=@dateend ORDER BY [Date2]

date2 это таблица TMP дата этот код отлично работает для меня


Рейтинг:
1

Patrice T

Цитата:
Баланс вычисляют получая какие то странные цифры посередине

Я не эксперт по SQL, но это пахнет как переупорядочение между частью, которая вычисляет баланс, и частью, которая его печатает.

Что происходит, когда вы используете точно такой же порядок everywhare?


GTR0123

я сделал это я изменил код использовал некоторые RunningTotall но используя временную таблицу soo она работает сейчас corectly thanx ребята

Patrice T

Если проблема решена и решение было полезным, вы можете принять решение, оно говорит всем, что поиск закончен.
Или, если вы предпочитаете, дополните свое решение небольшим объяснением и примите его.