Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
1

кейс в цикле

25.03.2013, 18:15. Показов 2021. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Еще раз здравствуйте, уважаемые форумчане.

Написал запрос, общая структура которого такова:

T-SQL
1
2
3
4
5
6
7
select
case
      when ... then ...
      when ... then ...
      when ... then ...
         ...............
end
Так как условия и значения в кейсе достаточно громоздкие и их 10 штук, то хотел бы в кейсе организовать цикл, но вот пока что-то не удается

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
declare @i real
set @i = 1
 
select
case
while @i<=10
begin  
when ...(@i) then ...(@i)
end
 
set @i=@i+1
end
посоветуйте, как его правильно организовать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2013, 18:15
Ответы с готовыми решениями:

Задача на кейс
Подскажите как выполнить данную задачу Локатор ориентирован на одну из сторон света («С» — север,...

Оператор кейс
Составить программу которая бы с помощью оператора кейс реализовала бы все возможные операции над...

Элитный Кейс
Доброго времени суток, уважаемые форумчане. У меня такая проблема, я пытаюсь воссоздать в...

Структура свитч-кейс
Написать программу,которая считает количество разных чисел, в рядке символов который вводится с...

6
1644 / 1145 / 171
Регистрация: 23.07.2010
Сообщений: 6,795
25.03.2013, 18:31 2
Не-а. Забудь
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
25.03.2013, 18:36  [ТС] 3
Почему? А как можно свернуть эти повторяющиеся условия?
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
26.03.2013, 04:10 4
Хм ... Если бы был представлен полный запрос, было бы понятнее ...
Использовать WHILE таким образом точно нельзя, да и логически это выглядит абсурдно. CASE - это ветвление аналогичное IF, только внутри запроса. То есть, для каждой строки будет верно только одно из перечисленных WHEN'ов. Цикл же повторяется до тех пор, пока верно условие под WHILE. Не совсем понятно, каким выглядит результат вашей конструкции.
Если у вас условия выражения во WHEN и CASE настолько похожи. что вы их можете выразить, как "...(@i)", то почему нельзя вместо 10-и WHEN'ов написать 1? Что то типа того:
T-SQL
1
SELECT CASE WHEN ...(Value) THEN ...(Value) END ... -- Где Value - это параметр, от которого зависит условие и значение, которое вставляется в результирующий набор. Теоретически, содержится в таблице, из которого производится выборка.
Если хотите менее абстрактное решение, то выкладывайте более детальный запрос.
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
26.03.2013, 10:21  [ТС] 5
Ну смысл таков, есть числовой столбец, который задается кейсом, в котором идут 10 повторяющихся условий, меняется только параметр @MONTHS от 1 до 10.
Есть еще один столбец, который задается аналогичной структурой и в котором отображается сообщение, какое условие сработало. Структура идентична, но на выходе кейсов не числовые данные, а название условий (Условие 1 ...).
Вот хочу оба этих поля свернуть для компактности.


T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
CASE
 
when
            TEST_SLIM4.dbo.sum_of_month(demand0, demand1, demand2, demand3, demand4, demand5, demand6, demand7, demand8, demand9, demand10, demand11) = @MONTHS then 
                case
                    when
                        --- тут мы считаем сколько месяцев в году выполняется условие  ПТ/Спрос(i) - 1 <= 30%, i = 1,...12 
                        TEST_SLIM4.dbo.sum_of_month_PT(@WORKDAYS, @WORKDAYS_BEFORE_TODAY, demandSoFarThisMonth, demand0, demand1, demand2, demand3, demand4, 
                            demand5, demand6, demand7, demand8, demand9, demand10, demand11) >= @MONTHS /3.0 
                    then @WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY -- коррекция Прогноза1
                    else 
                        --- Условие 3
                        case
                            when isnull(@WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY - 1.2*[demand0], 1) <= 0 and 
                                isnull(@WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY - 1.2*[demand1], 1) <= 0 then @WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY
                            when isnull(demand0, 0) > 0 and isnull(demand1, 0) <= 0 and isnull(demand2, 0) <= 0 and isnull(demand3, 0) <= 0 and isnull(demand4, 0) <= 0 and isnull(demand5, 0) <= 0 
                                and isnull(demand6, 0) <= 0 and isnull(demand7, 0) <= 0 and isnull(demand8, 0) <= 0 and isnull(demand9, 0) <= 0 and isnull(demand10, 0) <= 0 and isnull(demand11, 0) <= 0
                                and isnull(@WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY - 1.2*[demand0], 1) <= 0 then
                                @WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY
                 
                            else -- тогда выполняется УСЛОВИЕ 4
                 
                            ------------- Условие 4 ---------------- 
                                CASE
                                    WHEN (  SUM(case when ISNUMERIC(TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1, demandSoFarThisMonth)) = 1 
                                        then CONVERT(int, TEST_SLIM4.dbo.For_condition4(@TODAY, @ALLDAYS, g.ondate, g.Demand, forecast1, demandSoFarThisMonth)) else 0 end) > @TODAY/2.0 ) 
                                    THEN @WORKDAYS*[demandSoFarThisMonth]/@WORKDAYS_BEFORE_TODAY
                                ELSE -- тогда выполняется УСЛОВИЕ 4
    
                                    ------------- Условие 5 ---------------- 
 
                                    CASE 
                                        WHEN [TEST_SLIM4].dbo.For_condition5(demand0, demand1, demand2, demand3, demand4, demand5, demand6, demand7, demand8, demand9, demand10, demand11) > forecast1
                                    THEN [TEST_SLIM4].dbo.For_condition5(demand0, demand1, demand2, demand3, demand4, demand5, demand6, demand7, demand8, demand9, demand10, demand11)
                                    ELSE forecast1
 
                                    END ----------- Условие 5 закончилось 
 
                                END -----------  Условие 4 закончилось
                        
                        end -----------  Условие 3 закончилось
                        ----
                    
                end
 
END
Добавлено через 3 минуты
Можно было бы использовать функцию, чтобы закатать в нее этот кейс, но я уже внутри кейса использую другие свои функции
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
26.03.2013, 10:36 6
Lelik83, это у вас весь CASE, или 1/10 его часть? А то я здесь как то не заметил повторяющихся условий ...
Какое конкретно условие повторяется 10 раз? От куда берется @MONTHS? Если это переменная, то каким образом она меняется от 1 до 10?
0
5 / 5 / 1
Регистрация: 11.02.2013
Сообщений: 238
26.03.2013, 10:57  [ТС] 7
Это кусок кода. Во внешнем кейсе 10 условий when, первое из которых я и привел.
На само деле у меня сейчас нет параметра @MONTHS, его я привел в примере, для того, чтобы было понятно, чем условия отличаются друг от друга, то есть только этим параметром. Соответственно его и хотел завести для цикла.

Добавлено через 55 секунд
T-SQL
1
2
3
4
5
CASE
      when ... then
         ...........
      when ... then
END
0
26.03.2013, 10:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2013, 10:57
Помогаю со студенческими работами здесь

Смоделировать кейс/чехол для raspberry pi 3b +
Я ищю кого-нибудь, кто мог бы смоделировать кейс для распберри пи 3 б + (для 3д печати). Срочно....

Поместятся ли две одинаковые книги в кейс размерами X< Y <Z?
Поместятся ли две одинаковые книги в кейс размерами X&lt; Y &lt;Z? ( Размеры книги задавать в порядке...

Двоичная запись целого числа (Н<9),используя кейс оф !
Помогите пожалуйста! Мне нужно вывести двоичную записать десятичного целого числа (N&lt;9) При этом...

Кейс с основы, или чем заменить переднюю панель
Имеется старенький кейс, очень сильно пострадавший от моей психики, не считая сильных вмятен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru