Расчет средневзвешенной стоимости изобретеного бревна - PullRequest
0 голосов
/ 01 марта 2020

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

Я получил представление о том, что после каждого ввода / вывода я получаю текущий товарный запас:

StockID ArticleID TranDate TranCode Позиции Цена WACPrice WACRunningTotal 62515 698 00 : 00,0 В 484,05 280,56 484,05 89010 698 11: 48,1 вне 4 480,05 90155 698 39: 26,8 вне 3 477,05 93300 698 32: 21,5 В 400 302,1 877,05 89202 698 04: 57,4 OUT 1,5 875,55 87474 698 05: 28,6 OUT 4 871,55

Я хочу вычислить поле WACPrice

create proc sp_GetInventoryDetails_ByWAC
-- sp_GetInventoryDetails_ByWAC 10017
@ArticleId int
as
begin

-- select * from #stocktemp order by trandate 
--select *, 0 as WACRunningTotal into #StockTemp from stock where articleid=10000 order by TranDate;
;WITH y AS 
(
  SELECT articleid,TranDate,trancode, items, rn = ROW_NUMBER() OVER (ORDER BY TranDate)
    FROM stock where ArticleID =@ArticleId
), x AS
(
    SELECT articleid, TranDate,trancode, rn, items, rt = items
      FROM y
      WHERE rn = 1
    UNION ALL
    SELECT y.articleid,y.TranDate,y.trancode, y.rn, y.items,case when y.TranCode not in (1,5,6,10,20) then x.rt - y.items else x.rt+y.Items end
      FROM x INNER JOIN y
      ON y.rn = x.rn + 1
)

update st set st.WACRunningTotal=x.rt
from stock st
inner join x on x.ArticleID=st.ArticleID and x.TranDate=st.TranDate and x.TranCode=st.TranCode and isnull(st.WACRunningTotal,0)=0

OPTION (MAXRECURSION 0);




;WITH    StockCTE
          AS (SELECT    articleid,
                        items,
                        WACRunningTotal,
                        WACPrice,
                        trandate,
                        ROW_NUMBER() OVER (PARTITION BY articleid ORDER BY trandate) RowNum
              FROM      stock where ArticleID =@ArticleId),

/* CleanStock - A recursive CTE. This runs down the list of values for each stock, checking the Price column, if it is null it gets the previous non NULL value.*/
        CleanStock
          AS (SELECT    articleid,
                        items,
                        WACRunningTotal,
                        ISNULL(WACPrice ,0) WACPrice ,/* Ensure we start with no NULL values for each stock */
                        trandate,
                        RowNum
              FROM      StockCTE cur
              WHERE     RowNum = 1
              UNION ALL
              SELECT    Curr.articleid,
                        curr.items,
                        Curr.WACRunningTotal,
                        case when Curr.WACPrice=0 then  prev.WACPrice else ((curr.WACPrice*curr.Items)+(prev.WACRunningTotal*prev.WACPrice))/curr.WACRunningTotal end as WACPrice,
                        Curr.trandate,
                        Curr.RowNum
              FROM      StockCTE curr
              INNER JOIN CleanStock prev ON curr.articleid = prev.articleid
                                           AND curr.RowNum = prev.RowNum + 1)

/* Update the base table using the result set from the recursive CTE */
    UPDATE trg
    SET trg.WACPrice = src.WACPrice
    FROM    stock trg
    INNER JOIN CleanStock src ON trg.articleid = src.articleid
                                AND trg.trandate = src.trandate and trg.ArticleID=@ArticleId 

/* Display the results */
SELECT * FROM stock where ArticleID=@ArticleId order by TranDate

--drop table stock



end

, когда я реализую ЭТОТ код, я получаю следующую ошибку:

"Msg 240, Уровень 16, Состояние 1, Процедура sp_GetInventoryDetails_ByWA C, Строка 9 [Batch Start Line 0] Типы не совпадают между якорем и рекурсивной частью в столбце "rt" рекурсивного запроса "x". " пожалуйста помогите

...