被某个数字除入SQL列

被某个数字除入SQL列,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,嗯,我有一个储存在一列中的数字。如果我想除以该值,我只需要: 从myTable中选择columnName/12 可以把结果放在12列吗?我想让12更灵活。例如,如果我把这个值除以4,那么结果应该是4列 Value Result1 Result2 Result3 Result4 12000 3000 3000 3000 3000 有人知道如何做到这一点吗? 谢谢。使用动态查询可以实现这一点 declare @

嗯,我有一个储存在一列中的数字。如果我想除以该值,我只需要:

从myTable中选择columnName/12

可以把结果放在12列吗?我想让
12
更灵活。例如,如果我把这个值除以4,那么结果应该是4列

Value      Result1     Result2     Result3     Result4
12000      3000        3000        3000        3000
有人知道如何做到这一点吗?

谢谢。

使用动态查询可以实现这一点

declare  @cols nvarchar(max);
declare  @sql nvarchar(1000);

        with cte as (
                select 12000 as col1, 12000/4 as col2
                union all 
                select col1-col2, col2 from cte where col1 > col2
        )

select @cols =
        STUFF((select N',' + QUOTENAME(col2) from cte
        FOR XML PATH('')
        ), 1, 1, '') + N'';

select @cols

它必须是动态查询

检查下面

Create TABLE Table1 (Origional int)

Declare @DivisonValue INT = 4

insert into Table1 
VALUES (12000)

--Change the Top (12) to you what ever number you like. this will be your total number of columns
DECLARE @Columns VARCHAR(MAX) = (SELECT 
                        ',' + C.ColumnName + ' = Origional / ' + CAST(@DivisonValue AS VARCHAR(5))
                        /* Above line which you need to change for division */
                    FROM 
                        (SELECT TOP (@DivisonValue)
                                ColumnId    = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
                            ,ColumnName ='Result' +  CONVERT(VARCHAR(10), ROW_NUMBER() OVER (ORDER BY s1.[object_id]))
                        FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
                        ) AS C
                    ORDER BY
                        C.ColumnId
                    FOR XML PATH (''))          

DECLARE @FullQuery VARCHAR(MAX) = 'SELECT Origional,'+ substring(@Columns,2,LEN(@Columns)-1) + ' FROM Table1' 

EXEC (@FullQuery)

DROP TABLE table1
GO

根据您的除法需要更改逻辑。

如果您知道最大计数,则可以避免使用动态SQL:

从模型表开始模拟您的问题

DECLARE  @tbl TABLE(InitialValue DECIMAL(16,4));
INSERT INTO @tbl VALUES(12000),(20000),(10000);
--为了测试这一点,我使用了4的除数,试着用其他数字

DECLARE @divisor DECIMAL(16,4)=4;
--这就是问题所在

SELECT p.*
FROM
(
    SELECT t.InitialValue / @divisor As DivResult
          ,t.InitialValue
          ,CONCAT('div',FORMAT(A.Nmbr,'00')) AS ColumnName
    FROM @tbl t
    CROSS APPLY(SELECT TOP(CAST(@divisor AS INT)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values) A(Nmbr)
) t
PIVOT
(MAX(DivResult) FOR ColumnName IN(div01,div02,div03,div04,div05,div06,div07 /*add as many as you might need*/)) p;
结果

InitialValue    div01                   div02                       div03                       div04                       div05   div06   div07
10000.0000  2500.000000000000000000000  2500.000000000000000000000  2500.000000000000000000000  2500.000000000000000000000  NULL    NULL    NULL
12000.0000  3000.000000000000000000000  3000.000000000000000000000  3000.000000000000000000000  3000.000000000000000000000  NULL    NULL    NULL
20000.0000  5000.000000000000000000000  5000.000000000000000000000  5000.000000000000000000000  5000.000000000000000000000  NULL    NULL    NULL
如您所见,未使用的列被返回,但保持为空

与动态sql相比,我更喜欢这种方法,因为在大多数情况下,如果结果集及其结构是固定的和可预测的,那么消费者会更好


提示:如果需要,您可以将除数添加到结果集中…

12000、3000等的值是什么意思?如果除以4@phong,则结果是正确的,但结果是错误的。如果该值为12000,则另一个值除以4。。。每列应为3000。如果我除以4,则结果列应为4。值为3000。你的代码创建了12列。是的,这是可以的。是否可以将原始值添加到第一列?分隔器列编号应为动态,这是手动列。