SQL Сервер: l oop в операторе выбора, чтобы получить n столбцов - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь написать запрос, который даст мне таблицу с числом столбцов n + 1. Вместо того, чтобы просто записывать каждый столбец, каждый раз изменяя значение n, есть ли способ через l oop через него в SQL Сервер?

Результат, который я хочу получить, таков:

ID | 1 | 2 | 3 | ... | n 

Моя попытка была следующей:

DECLARE @Counter INT 
DECLARE @FCSTM INT = 36  -- Variable
DECLARE @Start INT = 0  -- Variable
DECLARE @StartDate DATE = Dateadd(mm, @Start, Dateadd(month, Datediff(month, 0, Getdate()), 0)) 
DECLARE @EndDate DATE = Dateadd(dd, -1, (DateAdd(mm, @FCSTM  + 1, @StartDate)))
SET @Counter=1
Tablex as
(SELECT DISTINCT ID,

WHILE ( @Counter <= @FCSTM)
BEGIN  
SUM(CASE WHEN (@Counter NOT BETWEEN Start AND End AND @FCSTM >= @Counter) THEN 0 END) as [@Counter],
SET @Counter = @Counter + 1
END

FROM Table123
GROUP BY ID)

Правка: выделил переменные. Намерение здесь состоит в том, чтобы динамически заполнить запрос оператором SELECT n столбцами, которые являются месяцами. n здесь @FCSTM - так что если @FCSTM = 36, то будет 36 столбцов плюс идентификатор столбца.

Я надеялся на FOR l oop à la python например .:

    @Counter = 1
    FOR i in range(0,@FCSTM):
        SUM(CASE WHEN (@Counter NOT BETWEEN Start AND End AND @FCSTM >= @Counter)
        @Counter = @Counter + 1

Что дало бы мне:

(select distinct ID,


    SUM(CASE WHEN (0 NOT BETWEEN Start AND End AND @FCSTM >= 0) THEN 0 END) as [0],
    SUM(CASE WHEN (1 NOT BETWEEN Start AND End AND @FCSTM >= 1) THEN 0 END) as [1],
    SUM(CASE WHEN (2 NOT BETWEEN Start AND End AND @FCSTM >= 2) THEN 0 END) as [2],
...
SUM(CASE WHEN (36 NOT BETWEEN Start AND End AND @FCSTM >= 36) THEN 0 END) as [36]

from Table123
group by ID)

1 Ответ

0 голосов
/ 11 марта 2020

Этого можно добиться с помощью Dynami c sql.

create table Table123
(
ID int
)

Logi c

DECLARE @Counter INT 
DECLARE @FCSTM INT
DECLARE @Start DATE
DECLARE @End DATE,@StrQuery varchar(max)
SET @Counter=0

set @StrQuery='select distinct ID,'

WHILE ( @Counter <= 40)
BEGIN  
set @StrQuery=@StrQuery+'null as '+ QUOTENAME(@Counter)+','
SET @Counter = @Counter + 1
END

set @StrQuery=SUBSTRING(@StrQuery,1,LEN(@StrQuery)-1)+' FROM Table123 Group by id'

exec (@StrQuery)

Выходной запрос

select distinct ID,null as [0],null as [1],null as [2],null as [3],null as [4],null as [5],null as [6],null as [7],null as [8],null as [9],null as [10],
null as [11],null as [12],null as [13],null as [14],null as [15],null as [16],null as [17],null as [18],null as [19],null as [20],null as [21],null as [22],
null as [23],null as [24],null as [25],null as [26],null as [27],null as [28],null as [29],null as [30],null as [31],null as [32],null as [33],null as [34],
null as [35],null as [36],null as [37],null as [38],null as [39],null as [40] FROM Table123 Group by id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...