Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Цикл  [new]
redicka
Member

Откуда:
Сообщений: 5
Здравствуйте.

Требуется выполнить select c группировкой в таблице 'dbo.table1' n раз, где n-количество переменных в этой таблице.
То есть select должен исполняться последовательно по каждому 'column_name', без использования union для каждой переменной.
Название каждой переменной должно быть указано.
Отдельно создана таблица с названиями переменных 'colums' с полями ('row', 'column_name'), где row - порядковый номер от 1 до n.

В результате исполнения запроса ниже выпадает результат запроса только по одной переменной, последней.
Помогите?, пожалуйста, найти ошибку и написать корректный запрос.

DECLARE @query varchar(5000), @tablename varchar(100), @columnname varchar(100), @cnt int, @row int
select @cnt=count(*) from dbo.colums
select @columnname=column_name, @row=row from dbo.colums

set @query= ' select ''' + @columnname + '''  as p, ' + @columnname + ', dt,
sum(case when target=1 then 1 else 0 end) b_cnt, 
sum(case when target=0 then 1 else 0 end) g_cnt
from table1 
group by dt,' + @columnname + ' 
order by dt, ' + @columnname + ' asc'

while @cnt>=@row
begin
exec(@query) 
set @row=@row+1
end
go


Спасибо!

Сообщение было отредактировано: 4 фев 16, 19:29
4 фев 16, 19:19    [18774476]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
redicka,

а где у вас в цикле @query и @cnt меняются?
4 фев 16, 19:40    [18774552]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
redicka,

и начальное значение @row какое? судя по select @columnname=column_name, @row=row from dbo.colums оно будет равно последнему, так что все правильно.
4 фев 16, 19:42    [18774563]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
redicka
Member

Откуда:
Сообщений: 5
WarAnt,

@cnt это требуемое количество вычислений. Разве оно должно меняться?
@query это запрос, он должен выполняться n раз.

подскажите, как правильно делать, я новичок.
4 фев 16, 20:00    [18774603]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
redicka
@query это запрос, он должен выполняться n раз.

подскажите, как правильно делать, я новичок.
А откуда нужно брать это "n"? У вас в коде нет переменной или поля с таким именем.

Вы напишите цикл на русском языке, без всяких SQL, что бы вам самому было понятно, что вы хотите сделать, и как. Это называется - "придумать алгоритм".

А потом уже переводите это всё на язык T-SQL
4 фев 16, 20:56    [18774731]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
redicka
подскажите, как правильно делать, я новичок.
Ну так научитесь отлаживать свой код - сразу поймете что не так и почему.
4 фев 16, 21:00    [18774748]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
redicka
WarAnt,

@cnt это требуемое количество вычислений. Разве оно должно меняться?
@query это запрос, он должен выполняться n раз.

подскажите, как правильно делать, я новичок.
Выводите отладочную информацию после каждой строки кода. Например так:
PRINT @row

Тогда сразу станет понятно в чем ошибка.
4 фев 16, 23:17    [18775226]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
redicka
Member

Откуда:
Сообщений: 5
alexeyvg
redicka
@query это запрос, он должен выполняться n раз.

подскажите, как правильно делать, я новичок.
А откуда нужно брать это "n"? У вас в коде нет переменной или поля с таким именем.

Вы напишите цикл на русском языке, без всяких SQL, что бы вам самому было понятно, что вы хотите сделать, и как. Это называется - "придумать алгоритм".

А потом уже переводите это всё на язык T-SQL


n в данном случае есть параметр @cnt
Я ведь написал, что мне нужно - выполнить последовательно несколько select для каждого столбца (переменной) таблицы table1, но не прописывать в коде название каждой переменной, а брать их также из таблицы.
4 фев 16, 23:24    [18775250]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
redicka
Member

Откуда:
Сообщений: 5
WarAnt
redicka,

и начальное значение @row какое? судя по select @columnname=column_name, @row=row from dbo.colums оно будет равно последнему, так что все правильно.


почему оно равно последнему? мне нужно, чтобы последовательно выполнялись запросы для row=1,2,3..n
4 фев 16, 23:27    [18775258]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
redicka
n в данном случае есть параметр @cnt
Я ведь написал, что мне нужно - выполнить последовательно несколько select для каждого столбца (переменной) таблицы table1, но не прописывать в коде название каждой переменной, а брать их также из таблицы.

redicka
мне нужно, чтобы последовательно выполнялись запросы для row=1,2,3..n

Ок. Ну вот, так и пишите.
Что бы "последовательно выполнялись запросы для row=1,2,3..n", нужно, что бы в первый раз row чему было равно? Правильно, row=1
А у вас что?
select @row=row from dbo.colums
Уже не единица, а может и единица, неизвестно.

Может, она равна @cnt?

Вот это и нужно выяснить для ваших данных.
Как уже сказали, элементарно отладив программу, вставив select @cnt, @row перед началом цикла.
5 фев 16, 01:02    [18775389]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
redicka
почему оно равно последнему? мне нужно, чтобы последовательно выполнялись запросы для row=1,2,3..n
У вас один запрос:
select @columnname=column_name, @row=row from dbo.colums

И выполняется он один раз, потому что вне цикла. И в обычную скалярную переменную можно присвоить только одно значение, даже если запрос возвращает несколько. И несложно посмотреть какое именно значение присваивается в пременную @row. А происходит так, потому что вы так написали.
5 фев 16, 03:19    [18775513]     Ответить | Цитировать Сообщить модератору
 Re: Цикл  [new]
redicka
Member

Откуда:
Сообщений: 5
Аллилуйя!
Спасибо за советы. Решил задачу курсором:



DECLARE
@column VARCHAR(100),
@row INT;

DECLARE
curs CURSOR FOR
SELECT column_name, row
FROM colums
ORDER BY row ASC;
OPEN curs
FETCH NEXT FROM curs INTO @column, @row

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC
(' select ''' + @column + ''' as predictor, ' + @column +
', dt,sum(case when target=1 then 1 else 0 end) bad, sum(case when target=0 then 1 else 0 end) good
from collection_stability_step1 group by dt,' + @column + ' order by dt, ' + @column + ' asc')

FETCH NEXT FROM curs INTO @column, @row
END

CLOSE curs;
DEALLOCATE curs;
5 фев 16, 14:14    [18777687]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить