【问题标题】:Divided by some number into column SQL除以某个数字成列 SQL
【发布时间】:2020-06-08 21:49:55
【问题描述】:

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

select columnName / 12 from myTable

是否可以将结果放入 12 列?我想让12 灵活。例如,如果我将值除以 4,那么结果应该是 4 列。

Value      Result1     Result2     Result3     Result4
12000      3000        3000        3000        3000

有谁知道如何做到这一点?
谢谢。

【问题讨论】:

  • 12000, 3000, and so on 的值是什么意思?
  • 除以4的结果@Phong

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

这可以使用动态查询来实现。

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

【讨论】:

    【解决方案2】:

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

    mockup-table 开始模拟您的问题

    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
    

    如您所见,未使用的列被返回但保持为 NULL。

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

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

    【讨论】:

    • 分隔列号应该是动态的,这个是手动列。
    【解决方案3】:

    必须是动态查询

    查看下方

    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
    

    根据你的划分需要改变逻辑。

    【讨论】:

    • 这一项是正确的,但结果是错误的。如果该值为 12,000,则除以 4 的另一个值...每列应为 3000。
    • 如果 i 除以 4,则结果列应为 4,其值为 3,000。您的代码创建了 12 列。
    • 是的,没关系。是否可以在第一列添加原始值?
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多