簡體   English   中英

將當前行值與前一行計算值相加

[英]add current row value with previous row calculated value

我有一張桌子,如下所示

OwnerId StartDate      EndDate      Volume
1         2020-01-01    2020-01-01  10.80
1         2020-01-02    2020-01-02  5.60
1         2020-01-03    2020-01-03  7.90
1         2020-01-04    2020-01-04  8.50

另一個具有以前值的表。

OwnerId PreviousVolume
1        0.70

1) 上一卷應該添加我的第一個表第一行 然后得到整數部分和小數部分值。

2)小數部分與第一個表格第二行相加,然后得到整數和小數部分,反之亦然。

ownerid startdate   enddate     Volume    Calculatedvolume  remainingexisting
1      2020-01-01   2020-01-01    10.80         11                   0.50
1      2020-01-02   2020-01-02    5.60           6                   0.10
1      2020-01-03   2020-01-03    7.90           8                   0.00
1      2020-01-04   2020-01-04    8.50           8                   0.50

你能請任何人幫忙嗎?

我認為這種查詢可能適用於您的問題,但我對 LEAD()(或 LAG()?)函數還有另一個想法,如果這不起作用,我將編輯我的答案並添加它:

DECLARE @count = 1;

SELECT TOP 1 
    ROW_NUMBER() OVER (PARTITION BY T1.OwnerId ORDER BY T1.startdate,T1.enddate) R#
    ,T1.OwnerId 
    ,T1.StartDate      
    ,T1.EndDate      
    ,T1.Volume
    ,FLOOR(T1.Volumn+T2.PreviousVolum) AS Calculatedvolume  
    ,(T1.Volumn+T2.PreviousVolum)%1 AS remainingexisting 
INTO #tmp
FROM T1 
INNER JOIN T2 ON T1.OwnerId = T2.OwnerId
ORDER BY T1.startdate,T1.enddate;

WHILE @count > (SELECT COUNT(*) FROM T1) 
BEGIN 

    INSERT INTO #tmp
    SELECT 
         @count+1
        ,T1.OwnerId 
        ,T1.StartDate      
        ,T1.EndDate      
        ,T1.Volume
        ,FLOOR(T1.Volumn+T2.Calculatedvolume) AS Calculatedvolume  
        ,(T1.Volumn+T2.Calculatedvolume)%1 AS remainingexisting 
    FROM T1 
    INNER JOIN #tmp T2 ON T1.OwnerId = T2.OwnerId AND T2.R# = @count
    WHERE ROW_NUMBER() OVER (ORDER BY T1.startdate,T1.enddate) = @count+1;

    SET @count += 1;

END 

如果我正確理解您的問題,下一個語句可能有助於獲得您的預期結果:

表格:

CREATE TABLE Table1 (
    OwnerId int, 
    StartDate date,      
    EndDate date,      
    Volume numeric(10, 2)
)
INSERT INTO Table1 
   (OwnerId, StartDate, EndDate, Volume)
VALUES
    (1, '20200101', '20200101', 10.80),
    (1, '20200102', '20200102', 5.60),
    (1, '20200103', '20200103', 7.90),
    (1, '20200104', '20200104', 8.50)
CREATE TABLE Table2 (
    OwnerId int,
    PreviousVolume numeric(10, 2)
)
INSERT INTO Table2 
    (OwnerId, PreviousVolume)
VALUES
    (1, 0.70)

陳述:

;WITH DataCte AS (
    SELECT OwnerId, NULL AS StartDate, NULL AS EndDate, PreviousVolume AS Volume
    FROM Table2
    UNION ALL
    SELECT OwnerId, StartDate, EndDate, Volume
    FROM Table1
), CalculationCTE AS (
    SELECT 
        OwnerId, StartDate, EndDate, Volume,
        SUM(Volume) OVER (PARTITION BY OwnerId ORDER BY StartDate) AS Total,
        CONVERT(numeric(10, 2), FLOOR(SUM(Volume) OVER (PARTITION BY OwnerId ORDER BY StartDate))) AS TotalFloor
    FROM DataCTE
)
SELECT
    OwnerId, StartDate, EndDate,
    FLOOR(Total - LAG(TotalFloor) OVER (PARTITION BY OwnerID ORDER BY StartDate)) AS CalculatedVolume,
    Total - TotalFloor AS RemainingExisting
FROM CalculationCTE

結果:

---------------------------------------------------------------------
OwnerId StartDate   EndDate     CalculatedVolume    RemainingExisting
---------------------------------------------------------------------
1       NULL        NULL        NULL                0.70 
1       2020-01-01  2020-01-01  11                  0.50
1       2020-01-02  2020-01-02  6                   0.10
1       2020-01-03  2020-01-03  8                   0.00
1       2020-01-04  2020-01-04  8                   0.50

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM