基于SQL循环的计算

基于SQL循环的计算,sql,sql-server,Sql,Sql Server,我有以下资料: 计算公式如下所示: For Exmaple H12 = =(C12-D12+C12-E12+C12-F12+C12-G12) +(D12-C12+D12-E12+D12-F12+D12-G12) +(E12-C12+E12-D12+E12-F12+E12-G12) +(F12-C12+F12-D12+F12-E12+F12-G12) +(

我有以下资料:

计算公式如下所示:

For Exmaple H12 = =(C12-D12+C12-E12+C12-F12+C12-G12)
                  +(D12-C12+D12-E12+D12-F12+D12-G12)
                  +(E12-C12+E12-D12+E12-F12+E12-G12)
                  +(F12-C12+F12-D12+F12-E12+F12-G12)
                  +(G12-C12+G12-D12+G12-E12+G12-F12)
简而言之,对于类别1,col1值即2减去col1值,通过保持col1为固定值,然后再加上相同的值,将剩余列的col1值减为col1值

附加条件是可以有任意数量的列COL和任意数量的类别。 所以我试图写一段代码。但是如何编写计算部分呢

DECLARE @i int = 0 
DECLARE @j int = 0
DECLARE @k int = 1
DECLARE @Category_Count int = (select count(distinct Category) from Table) --This I am getting some other table
DECLARE @columns int = (select count(distinct columns) from Table) --This I am getting some other table

WHILE @i < @Category_Count 
BEGIN
    WHILE @j < @columns 
    BEGIN
        WHILE @k < @Category_Count 
        BEGIN
            /* Calculation=
            How to write this part */
            SET @k = @k + 1
        END
        SET @j = @j + 1
    END

    SET @i = @i + 1
END

我不明白你在问什么,但是,你看起来是在用编程的方式思考。SQL不是一种编程语言,它是一种查询语言,应该使用基于集合的解决方案编写,而不是使用迭代的解决方案。在一段时间内有一段时间肯定是代码速度非常慢的标志。如果你仔细查看H12公式,你会发现每列用+列出4次,用-列出4次。所以H12的值总是0。请复习这个问题,更好地解释你在找什么。好地方,@NicolaLepetit。完全同意,这是毫无意义的数学,因为它的结果是正确的,但我想在SQL中实现这一点,所以问题就来了。那么你不就用Col1替换C12,用Col2替换D12。。。G12和Col6?感谢您的努力,但这并不能满足cols列数和类别数的要求。唯一可行的方法是使用动态SQL,而不是固定SQL。请更新您的答案使用动态SQL,否则请考虑删除它。我试过了,这肯定管用。你在尝试动态列吗?你真的需要吗?
create table #tab1
(
Category varchar(1),
col1 int,
col2 int,
col3 int,
col4 int,
col5 int,
Calculation int
)

insert into #tab1 values('a',2,3,1,1,3,0),('b',1,3,3,3,2,0),('c',12,5,4,2,6,0),('d',2,3,4,3,2,0),('e',2,1,2,1,1,0),('f',2,3,1,2,2,0),('g',2,3,1,1,3,0),('h',2,3,1,1,3,0),('i',2,3,1,1,3,0),
('j',2,3,1,1,3,0)


DECLARE @count int = 0 
DECLARE @j int = 0
DECLARE @k int = 1

select row_number() over(order by category) as RN,* into #tab2 from #tab1
select @count=count(*) from #tab1


WHILE (@k <= @count) 
BEGIN

    update  #tab2 set Calculation=
            ((col1-col2+col1-col3+col1-col4+col1-col5)
           +(col2-col2+col2-col3+col2-col4+col2-col5)
           +(col3-col2+col3-col2+col3-col4+col3-col5)
           +(col4-col2+col4-col2+col4-col3+col4-col5)
           +(col5-col2+col5-col2+col5-col3+col5-col4))
           from #tab2 where RN= @k

   set @k=@k+1
END