Делится на некоторое число в столбце SQL - PullRequest
0 голосов
/ 25 февраля 2020

Ну, у меня есть номер, который хранится в столбце. Если я хочу разделить значение, мне просто нужно:

select columnName / 12 from myTable

Можно ли поместить результат в 12 столбцов? Я хочу сделать 12 гибким. Так, например, если я разделю значение на 4, то результатом будет 4 столбца.

Value      Result1     Result2     Result3     Result4
12000      3000        3000        3000        3000

Кто-нибудь знает, как этого добиться?
Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Это должен быть динамический c запрос

Проверьте ниже

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

Измените лог c в соответствии с вашими потребностями для разделения.

0 голосов
/ 25 февраля 2020

Вы можете избежать динамичности c 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

Как видите, неиспользуемые столбцы возвращаются, но остаются NULL.

Я бы предпочел этот подход, а не Dynami c sql, так как в большинстве случаев потребитель лучше, если набор результатов и его структура фиксирована и предсказуема ...

Подсказка: при необходимости вы можете добавить делитель в набор результатов ...

0 голосов
/ 25 февраля 2020

Это достижимо с помощью динамического c запроса.

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
...