SQL在行之间生成值

SQL在行之间生成值,sql,sql-server,Sql,Sql Server,我有3行数据,希望在行之间添加值。在excel中,我可以使用excel公式并手动创建,但我想在SQL中创建它。预期结果如图所示: 在图中,F3是获得ID 1和2之间的平均值,并将其除以10。得到平均值后,使用E3中的第一个值并加上值F3,得到1.271111。E5使用E4添加值F3等 我想在不同ID之间添加额外的10行,并基于ID之间的差值,将之前的值与差值相加。在SQL语句中不可能这样做吗?我对你的平均值感到困惑 SELECT (10 - 0.18) / 9 -- 1.091111 -- Th

我有3行数据,希望在行之间添加值。在excel中,我可以使用excel公式并手动创建,但我想在SQL中创建它。预期结果如图所示:

在图中,F3是获得ID 1和2之间的平均值,并将其除以10。得到平均值后,使用E3中的第一个值并加上值F3,得到1.271111。E5使用E4添加值F3等


我想在不同ID之间添加额外的10行,并基于ID之间的差值,将之前的值与差值相加。在SQL语句中不可能这样做吗?

我对你的平均值感到困惑

SELECT (10 - 0.18) / 9 -- 1.091111 -- This is your average?
--
SELECT (10 - 0.18) / 10 -- 0.982000000
SELECT (32.11 - 10) / 10 -- 2.211000
您可以按以下方式进行操作:

DECLARE @Tbl TABLE (Id INT, Value DECIMAL(7, 5))
INSERT INTO @Tbl        
VALUES  
(1, 0.18),
(2, 10),
(3, 32.11)

;WITH CTE
AS 
(
    SELECT 
        Id ,
        Value, 
        COALESCE((LEAD(Value) OVER (ORDER BY Id) * 1.0 - Value * 1.0) / 10, 0) AS AverageValue
    FROM @Tbl
)

--SELECT (10 - 0.18) / 10 -- 0.982000000
--SELECT (32.11 - 10) / 10 -- 2.211000

SELECT DISTINCT 
    A.Id,
    COALESCE((B.RowId * 1.0 * A.AverageValue) + A.Value,0) AS Result
FROM
    CTE A CROSS JOIN
    (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) B(RowId) 

注意:这是针对2012+

您需要递归CTE:

;WITH YourTable AS ( --simulation of your table
    SELECT * FROM (VALUES (1,0.18),(2,10),(3,32.11)) as t(Id,[Value])
), cte AS ( --Don't know what version of SQL Server you are using
    SELECT  a.ID,   --so I use OUTER APPLY to get next string value
            cast(a.[Value] as float) [Value],
            ISNULL(CAST((b.[Value]-a.[Value])/10 as float),0.00) as Seq
    FROM YourTable a
    OUTER APPLY (
        SELECT TOP 1 *
        FROM YourTable
        WHERE a.ID < ID
        ORDER BY ID ASC
        ) b
), final AS (
    SELECT  c.ID,
            c.[Value],
            c.Seq
    FROM cte c
    UNION ALL
    SELECT  CASE WHEN f.[Value]+f.Seq = c.[value] THEN c.id ELSE f.id END,
            f.[Value]+f.Seq,
            CASE WHEN ROUND(f.[Value]+f.Seq,2) = ROUND(c.[value],2) THEN c.Seq ELSE f.Seq END
    FROM final f
    INNER JOIN cte c
        ON c.ID = f.ID+1 and
             ROUND(f.[Value]+f.Seq,2) < ROUND(c.[value],2)
    WHERE f.seq > 0 
)

SELECT  ROW_NUMBER() OVER (ORDER BY [Value]) as ID,
        [Value],
        Seq
FROM final
ORDER BY id,[Value]
OPTION (MAXRECURSION 200)

首先,你不能有一个空id!您可以添加数据。可能是重复的,请说明您的excel工作表公式的具体用途。SQL Server不支持空/重复ID。如果您希望id列不是'id'/主键,而只是一列,那么这是可能的。很抱歉,将-1作为问题放入框中是不正确的。也许Arzozeus的意思是SELECT结果应该在每个ID之间返回额外的10行。因此,这不是关于添加到原始表,而是关于显示查询的预期结果,然后可以添加到其他表中table@Smit,对不起,弄错了,id是在SQL中生成的,每行递增。@SurajitBiswas,很抱歉出错,id是在SQL中生成的,每行递增。我左边的excel公式,是得到ID 1和2之间的差值,然后在excel行之间除以长度,然后得到平均值。右边的公式是第一个值加上平均值,然后在值加上后,第三列将使用第二列值加上平均值,依此类推
ID  Value   Seq
1   0,18    0,982
2   1,162   0,982
3   2,144   0,982
4   3,126   0,982
5   4,108   0,982
6   5,09    0,982
7   6,072   0,982
8   7,054   0,982
9   8,036   0,982
10  9,018   0,982
11  10      2,211
12  12,211  2,211
13  14,422  2,211
14  16,633  2,211
15  18,844  2,211
16  21,055  2,211
17  23,266  2,211
18  25,477  2,211
19  27,688  2,211
20  29,899  2,211
21  32,11   0