被某个数字除入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列。是的,这是可以的。是否可以将原始值添加到第一列?分隔器列编号应为动态,这是手动列。