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

Откуда: Казань
Сообщений: 6
Можно ли внутри Select использовать цикл? Если можно, приведите пример. Спасибо
1 мар 09, 12:52    [6874258]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
renats
Можно ли внутри Select использовать цикл? Если можно, приведите пример. Спасибо
Это сложно представить мысленно, прямо какая-то математическая абстракция...

Интересно, как будет выглядить цикл внутри оператора присваивания, например? Или в операторе return?
1 мар 09, 12:56    [6874264]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
renats
Member

Откуда: Казань
Сообщений: 6
У меня оператор Select участвует в цикле, выбираются записи из временной таблицы #table с первой записи и пока не конец #table.
мне нужно в цикле перебирать записи(начиная с текущей), пока не найдется первое значение не NULL и его выбрать.
1 мар 09, 13:12    [6874273]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Glory
Member

Откуда:
Сообщений: 104760
renats
У меня оператор Select участвует в цикле, выбираются записи из временной таблицы #table с первой записи и пока не конец #table.
мне нужно в цикле перебирать записи(начиная с текущей), пока не найдется первое значение не NULL и его выбрать.

И это разве нельзя сразу сделать select-ом ?
1 мар 09, 13:19    [6874283]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
renats
У меня оператор Select участвует в цикле, выбираются записи из временной таблицы #table с первой записи и пока не конец #table.
Код покажите, чтобы совсем понятно было.

renats
мне нужно в цикле перебирать записи(начиная с текущей), пока не найдется первое значение не NULL и его выбрать.
select top 1 * from #table where val is not null and id > @id_current
1 мар 09, 13:30    [6874296]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Taffy
Member

Откуда:
Сообщений: 20501
renats
У меня оператор Select участвует в цикле, выбираются записи из временной таблицы #table с первой записи и пока не конец #table.
мне нужно в цикле перебирать записи(начиная с текущей), пока не найдется первое значение не NULL и его выбрать.

Вам не нужно "в цикле"
t-sql ные операторы работают не с каждой записью. А со всей таблицей целиком.
То есть - чтобы написать селект - представляем себя волшебниками и говорим серверу - дай мне такие-то значения (указываем колонки таблицы), из таких-то таблиц, удовлетворяющих такому-то условию.
Нету тут понятия "первая" и "следующая". Есть - записи, подпадающие под нужное нам условие. Ну, можем еще и отсортировать - отсортированные в нужной нам последовательности
--дай мне такие-то значения 
select id, name, kolvo
--из таких-то таблиц
from mytable
--удовлетворяющих такому-то условию.
where prizn is not null
и получаем _все_ записи, удовлетворяющие условию
А...
а если вам нужна только одна запись - то указываем
--дай мне такие-то значения - 1 строку
select top 1 id, name, kolvo
--из таких-то таблиц
from mytable
--удовлетворяющих такому-то условию.
where prizn is not null
--записи должны сортироваться по id
order by id
1 мар 09, 13:35    [6874305]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
renats
Member

Откуда: Казань
Сообщений: 6
while @q<=(select count(*) from #ttable)
begin
insert into rasp (id,dol)
select newid(), case when b is null then ищем b в #ttable, которое not null в цикле начиная с id=@q
(с тек.записи), id уменьшаем на единицу (выполняем проход вверх) -- вот этот цикл как сделать? end
from #ttable where id=@q
set @q=@q+1
end
1 мар 09, 14:42    [6874368]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
renats
while @q<=(select count(*) from #ttable)
begin
insert into rasp (id,dol)
select newid(), case when b is null then ищем b в #ttable, которое not null в цикле начиная с id=@q
(с тек.записи), id уменьшаем на единицу (выполняем проход вверх) -- вот этот цикл как сделать? end
from #ttable where id=@q
set @q=@q+1
end
Опишите по русски, что нужно вставить в поле dol.
1 мар 09, 14:57    [6874387]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
renats
Member

Откуда: Казань
Сообщений: 6
в таблице есть такие данные
1. ректор ------1000
2. проректор----800
3. стар.преп.----500
4. null-----------500
5. null-----------400
6. null-----------400
и т.д.
там, где null нужно вставить значение из предыдущей строки.
я пробовал делать так: case when b is null then (select b from #ttable where id=@q-1) end т.е. беру предыдущую запись. Работает только для 4-ой строки (из примера), для следующих записывается null
1 мар 09, 15:17    [6874406]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Вы в состоянии написать здесь скрипт создания таблицы (CREATE TABLE ...) и скрипт заполнения таблицы тестовыми данными (INSERT ...).

После этого напишите, что надо получить.

Пользуйтесь тегом [src] - Вас же невозможно читать.

Какая версия сервера?
1 мар 09, 16:03    [6874444]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
renats
в таблице есть такие данные
1. ректор ------1000
2. проректор----800
3. стар.преп.----500
4. null-----------500
5. null-----------400
6. null-----------400
и т.д.
там, где null нужно вставить значение из предыдущей строки.
я пробовал делать так: case when b is null then (select b from #ttable where id=@q-1) end т.е. беру предыдущую запись. Работает только для 4-ой строки (из примера), для следующих записывается null
Так зачем тут цикл???

insert into rasp (id,dol)
select	newid(), 
		(select top 1 t2.b from #ttable as t2 where t2.b is not null and t2.id < t1.id order by t2.id desc)
from #ttable as t1 
where t1.b is null

И при формулировке задачи учитывайте, что сказал iap:
iap
Вы в состоянии написать здесь скрипт создания таблицы (CREATE TABLE ...) и скрипт заполнения таблицы тестовыми данными (INSERT ...).

После этого напишите, что надо получить.

Пользуйтесь тегом [src] - Вас же невозможно читать.

Какая версия сервера?
1 мар 09, 16:49    [6874501]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
renats
Member

Откуда: Казань
Сообщений: 6
Всем большое спасибо за участие! Сделал как посоветовал alexeyvg
1 мар 09, 18:01    [6874574]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Salavt7
Member

Откуда:
Сообщений: 2
У меня задача несколько иная, но чтобы не плодить топики, напишу тут. Имеются 2 даты (дата начала и окончания отпуска). Необходимо сделать выборку всех дат между ними не прибегая к временным таблицам (ибо делается это в функции, а она на это жутко ругается).
Имеется код с применением временных таблиц:
create table #table1 (i datetime)
truncate table xx_otpuska_temp
declare @date1 datetime
declare @date2 datetime
set @date1='2009-01-08'
set @date2='2009-02-08'
while @date1<=@date2

begin
insert into #table1 (i)
select @date1
set @date1=@date1+1
end
select * from #table1
drop table #table1

Подскажите, как обойтись без них.
21 май 09, 18:56    [7212132]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Salavt7
Имеются 2 даты (дата начала и окончания отпуска). Необходимо сделать выборку всех дат между ними
CTE+iap, Задача №1
21 май 09, 19:00    [7212142]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
declare @t table (i int)
???

для спящего время бодрствования равносильно сну
21 май 09, 19:04    [7212162]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Sergey Sizov
Member

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

declare @date1 datetime
declare @date2 datetime
set @date1='2009-01-08'
set @date2='2009-02-08'

select dateadd(d, number, @date1) from master..spt_values 
where number between 0 and datediff(d, @date1, @date2) and type ='P'
21 май 09, 19:20    [7212235]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Salavt7
Member

Откуда:
Сообщений: 2
Всем большое спасибо :)
Как говорят, а слона то я не приметил )))
21 май 09, 20:16    [7212416]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Цикл внутри Select  [new]
Ирина Bl
Member

Откуда:
Сообщений: 10
У меня тоже вопрос про цикл в операторе SELECT... или как его обойти?
запрос такой, можно ли циклом пройтись здесь?

SELECT
AC_DEPID as DEP_ID,
"D1" = COUNT (case when DAY(TIMEEDIT) =1 THEN 1 else NULL end),
"D2" = COUNT (case when DAY(TIMEEDIT) =2 THEN 1 else NULL end),
"D3" = COUNT (case when DAY(TIMEEDIT) =3 THEN 1 else NULL end),
"D4" = COUNT (case when DAY(TIMEEDIT) =4 THEN 1 else NULL end),
"D5" = COUNT (case when DAY(TIMEEDIT) =5 THEN 1 else NULL end),
"D6" = COUNT (case when DAY(TIMEEDIT) =6 THEN 1 else NULL end),
"D7" = COUNT (case when DAY(TIMEEDIT) =7 THEN 1 else NULL end),
"D8" = COUNT (case when DAY(TIMEEDIT) =8 THEN 1 else NULL end),
"D9" = COUNT (case when DAY(TIMEEDIT) =9 THEN 1 else NULL end),
"D10" = COUNT (case when DAY(TIMEEDIT) =10 THEN 1 else NULL end)

FROM #tblLOG_AGENCY_COMMITION GROUP BY AC_DEPID;
GO
14 авг 12, 22:06    [13011869]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Ирина Bl,

Какая задача, что нужно получить в итоге?
И что вернет следующий запрос
SELECT @@VERSION
14 авг 12, 23:22    [13012065]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
6874264
14 авг 12, 23:24    [13012071]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Ирина Bl
Member

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

Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86)
Feb 10 2012 19:13:17
Copyright (c) Microsoft Corporation
Express Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)

Имеется таблица "Снимок" нужно получить гистограмму "Снимок1"

К сообщению приложен файл. Размер - 5Kb
15 авг 12, 06:53    [13012604]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Ирина Bl
Member

Откуда:
Сообщений: 10
Ирина Bl,

К сообщению приложен файл. Размер - 7Kb
15 авг 12, 06:53    [13012605]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Ирина Bl
Ирина Bl,


К сообщению приложен файл. Размер - 16Kb
15 авг 12, 07:17    [13012611]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Ken@t
Ирина Bl
Ирина Bl,


жжёшь!!!
15 авг 12, 08:35    [13012716]     Ответить | Цитировать Сообщить модератору
 Re: Цикл внутри Select  [new]
Ирина Bl
Member

Откуда:
Сообщений: 10
Ken@t,

у меня ошибка выпадает... колонка в таблице D это у меня результат применения функции DAY к дате.
Ошибка выпадает здесь: COUNT ( DAY (TIMEEDIT))....

SELECT 
DEP_ID
, [1] [D1]
, [2] [D2]
, [3] [D3]
, [4] [D4]

FROM #tblLOG_AGENCY_COMMITION
PIVOT (
COUNT ( DAY (TIMEEDIT))
FOR DAY (TIMEEDIT) IN ([1], [2], [3], [4])
) P
15 авг 12, 12:48    [13014164]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить