powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL 2008
25 сообщений из 26, страница 1 из 2
SQL 2008
    #39586040
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, поалуйста. Почему второй case не обрабатывает, точнее начиная с него ошибки (подчеркивает красным. А ругается на первый case
ALTER TABLE dbo.Заявка DROP COLUMN PointCalc;
GO
ALTER TABLE dbo.Заявка ADD PointCalc AS
(
case when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime = '1' then 10
else 8 end
case when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime = '1' then 10
else 0 end
case when Приоритет.PrioritetCalc= '1-го уровня' and Заявка.Ontime = '1' then 10
else 3 end
case when Приоритет.PrioritetCalc= '2-го уровня' and Заявка.Ontime = '1' then 10
else 5 end
case when Приоритет.PrioritetCalc= 'Ошибка 3-го уровня' and Заявка.Ontime = '1' then 10
else 7 end
case when Приоритет.PrioritetCalc= 'Ошибка 4-го уровня' and Заявка.Ontime = '1' then 10
else 8 end
case when Приоритет.PrioritetCalc= 'Доработка' and Заявка.Ontime = '1' then 10
else 8 end

);
...
Рейтинг: 0 / 0
SQL 2008
    #39586041
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992, потому что end?
...
Рейтинг: 0 / 0
SQL 2008
    #39586042
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... и не только... что хотите-то?
...
Рейтинг: 0 / 0
SQL 2008
    #39586043
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992,

Медведь упрлс с этими CASE

до конца лень писать
Код: sql
1.
2.
3.
4.
5.
case 
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime = '1' then 10
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime <> '1' then 8
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime = '1' then 10 
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime <> '1' then 0
...
Рейтинг: 0 / 0
SQL 2008
    #39586046
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

case when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime = '1' then 10
else 8
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime = '1' then 10
else 0
when Приоритет.PrioritetCalc= '1-го уровня' and Заявка.Ontime = '1' then 10
else 3
when Приоритет.PrioritetCalc= '2-го уровня' and Заявка.Ontime = '1' then 10
else 5
when Приоритет.PrioritetCalc= 'Ошибка 3-го уровня' and Заявка.Ontime = '1' then 10
else 7
when Приоритет.PrioritetCalc= 'Ошибка 4-го уровня' and Заявка.Ontime = '1' then 10
else 8
when Приоритет.PrioritetCalc= 'Доработка' and Заявка.Ontime = '1' then 10
else 8
Ошибки. Мне нужен else ,поэтому и добавила case - end лишних
...
Рейтинг: 0 / 0
SQL 2008
    #39586049
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам не else нужно, а словами рассказать, что вы тут городите.
...
Рейтинг: 0 / 0
SQL 2008
    #39586052
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

гороу вычисляемое поле. Оно заполняется по указанным критериям . Т.Е. важны только :
PrioritetCalc = 'Критическая ошибка' если в срок, то 10 если не в срок 3
Приоритет.PrioritetCalc= '1-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= '2-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 3-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 4-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Поле PrioritetCalc находится в таблице Приоритет. Новое поле создается в таблице Заявка, связянной с табл. ПРиоритет с вторичным ключем
...
Рейтинг: 0 / 0
SQL 2008
    #39586055
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992Гавриленко Сергей Алексеевич,

гороу вычисляемое поле. Оно заполняется по указанным критериям . Т.Е. важны только :
PrioritetCalc = 'Критическая ошибка' если в срок, то 10 если не в срок 3
Приоритет.PrioritetCalc= '1-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= '2-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 3-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 4-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Поле PrioritetCalc находится в таблице Приоритет. Новое поле создается в таблице Заявка, связянной с табл. ПРиоритет с вторичным ключемВам же уже написали вот тут 21114754
...
Рейтинг: 0 / 0
SQL 2008
    #39586056
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992,

я же написал тебе замену else, что ж не так
...
Рейтинг: 0 / 0
SQL 2008
    #39586058
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

потому что в каждой ветке OnTime = 0 (else) свои баллы. Или добавлять дополнительный when для условий, когда OnTime = 0 ?
...
Рейтинг: 0 / 0
SQL 2008
    #39586061
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992,

case перебирает свои when-ы сверху вниз пока не наткнётся на тот который даёт истину по условиям
(выполняется только этот when-then остальные игнорируются)

поэтому:
Код: sql
1.
2.
3.
4.
case 
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime = '1' then 10 
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime <> '1' then 3
end

проверяет первое условие если истина то только в этом случае будет 10 (и на этом case закончится)
если не истина проверяем дальше вниз, второй when отличается от первого только Заявка.Ontime <> '1'
т.е. 3 балла будет только если "критическая и не в срок"
...
Рейтинг: 0 / 0
SQL 2008
    #39586064
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK
Код: sql
1.
2.
3.
4.
case 
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime = '1' then 10
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime <> '1' then 8
...


Тц-тц-тц. И все записи Заявка.Ontime = NULL свалятся в NULL. И возопит ТС, что дали ему кривой скрипт :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime = '1' then 10
when Приоритет.PrioritetCalc = 'Консультация' then 8
-- для счастливых обладателей 2012+
CASE [Приоритет].[PrioritetCalc]
  WHEN 'Консультация'       THEN IIF( [Заявка].[Ontime] = '1', 10, 8 )
  WHEN 'Критическая ошибка' THEN IIF( [Заявка].[Ontime] = '1', 10, 0 )
  WHEN '1-го уровня'        THEN IIF( [Заявка].[Ontime] = '1', 10, 3 )
  WHEN '2-го уровня'        THEN IIF( [Заявка].[Ontime] = '1', 10, 5 )
  WHEN 'Ошибка 3-го уровня' THEN IIF( [Заявка].[Ontime] = '1', 10, 7 )
  WHEN 'Ошибка 4-го уровня' THEN IIF( [Заявка].[Ontime] = '1', 10, 8 )
  WHEN 'Доработка'          THEN IIF( [Заявка].[Ontime] = '1', 10, 8 )
END
...
Рейтинг: 0 / 0
SQL 2008
    #39586065
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, оу, в заголовке 2008. ну тогда долгий и мучительный WHEN WHEN WHEN, а в конце the END
...
Рейтинг: 0 / 0
SQL 2008
    #39586066
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя тут прослеживается чудовищная логика
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CASE
  WHEN [Заявка].[Ontime] = '1'                                THEN 10
  WHEN [Приоритет].[PrioritetCalc] = 'Консультация'           THEN 8
  WHEN [Приоритет].[PrioritetCalc] = 'Критическая ошибка'     THEN 0
  WHEN [Приоритет].[PrioritetCalc] = '1-го уровня'            THEN 3
  WHEN [Приоритет].[PrioritetCalc] = '2-го уровня'            THEN 5
  WHEN [Приоритет].[PrioritetCalc] = 'Ошибка 3-го уровня'     THEN 7
  WHEN [Приоритет].[PrioritetCalc] = 'Ошибка 4-го уровня'     THEN 8
  WHEN [Приоритет].[PrioritetCalc] = 'Доработка'              THEN 8
END
...
Рейтинг: 0 / 0
SQL 2008
    #39586123
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,
а джойн где писать ? ИЛи условие where
У меня ругается на :
Не удалось привязать составной идентификатор "Приоритет.PrioritetCalc".
Т.Е, нужно соединение добавляю после до \после end - ругается. По идее это не Select -й запрос .
...
Рейтинг: 0 / 0
SQL 2008
    #39586134
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992а джойн где писать ? ИЛи условие where А с чего вы решили, что при создании вычисляемого поля можно писать join или where? Используете буйную фантазию вместо документации?
...
Рейтинг: 0 / 0
SQL 2008
    #39586297
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992Руслан Дамирович,
а джойн где писать ? ИЛи условие where
Так это вам не вычисляемое поле нужно. А триггер уже
Код: 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.
CREATE TRIGGER dbo.[Заявка_триггер_Расчет_Приоритета] ON dbo.[Заявка]
AFTER INSERT, UPDATE
AS
BEGIN
  UPDATE
    t
  SET
    t.[PointCalc] = CASE
        WHEN t.[Ontime] = '1'                         THEN 10
        WHEN s.[PrioritetCalc] = 'Консультация'       THEN 8
        WHEN s.[PrioritetCalc] = 'Критическая ошибка' THEN 0
        WHEN s.[PrioritetCalc] = '1-го уровня'        THEN 3
        WHEN s.[PrioritetCalc] = '2-го уровня'        THEN 5
        WHEN s.[PrioritetCalc] = 'Ошибка 3-го уровня' THEN 7
        WHEN s.[PrioritetCalc] = 'Ошибка 4-го уровня' THEN 8
        WHEN s.[PrioritetCalc] = 'Доработка'          THEN 8
      END
  FROM
    inserted i
    INNER JOIN dbo.[Заявка] t ON (
          t.[<id_заявки>] = i.[<id_заявки>] )
    LEFT JOIN dbo.[Приоритет] s ON (
          s.[<id_приоритета>] = t.[<id_приоритета>] )
  ;
END
GO
...
Рейтинг: 0 / 0
SQL 2008
    #39586785
isq_yar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич, именно так ) как Вы догадались )
...
Рейтинг: 0 / 0
SQL 2008
    #39586786
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,

Огромное спасибо!!!
Отработало, но почему то значения null даже там, где OnTime=1. Может быть потому, что OnTime - вычисляемое поле?
К нему тоже триггер писать ?

USE [БД_Заявки]
GO
/****** Object: Trigger [dbo].[Заявка_триггер_Расчет_Баллов] Script Date: 01/19/2018 05:15:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Заявка_триггер_Расчет_Баллов] ON [dbo].[Request]
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE
t
SET
t.[PointCalc] = CASE
WHEN t.[Ontime] = '1' THEN 10
WHEN s.[PrioritetCalc] = 'Консультация' THEN 8
WHEN s.[PrioritetCalc] = 'Критическая ошибка' THEN 0
WHEN s.[PrioritetCalc] = '1-го уровня' THEN 3
WHEN s.[PrioritetCalc] = '2-го уровня' THEN 5
WHEN s.[PrioritetCalc] = '3-го уровня' THEN 7
WHEN s.[PrioritetCalc] = '4-го уровня' THEN 8
WHEN s.[PrioritetCalc] = 'Доработка' THEN 8
END
FROM
inserted i
INNER JOIN dbo.Request t ON (
t.KeyRequest= i.KeyRequest)
INNER JOIN dbo.Prioritet s on
(
s.[<KeyPrioritet>] = t.[<KeyPrioritet>] )
;
END
...
Рейтинг: 0 / 0
SQL 2008
    #39587669
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,
Вы не подскажите, почему триггер не работает? Даже для условия OnTime =1. Оно физически есть в БД, и значения тоже :(
...
Рейтинг: 0 / 0
SQL 2008
    #39587690
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992Руслан Дамирович,
Вы не подскажите, почему триггер не работает? Даже для условия OnTime =1. Оно физически есть в БД, и значения тоже :(А сам запрос данные возвращает? Не в триггере?
...
Рейтинг: 0 / 0
SQL 2008
    #39587709
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

запрос на выборку, да возвращает
...
Рейтинг: 0 / 0
SQL 2008
    #39587722
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович, я вышла из базы, снова зашла - не работало. Написало парочку запросов UPDATE к другими столбцам. И о чудо! Поле заполнилось))))))))))))). Хотя до этого и сохраняла, и селекты с выборками различными делала - не в какую.... И несколько раз нажимала выполнить на запросе ( триггере ) Я думаю, зря я переименовала стобцы, не везде дошло до базы ). Большущее спасибо лично Вам за помощь !!!))))) И спасибо всем участникам ))))))))))))))) Вселенской моркови всем вам )))))))
...
Рейтинг: 0 / 0
SQL 2008
    #39587761
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
isq1992И несколько раз нажимала выполнить на запросе ( триггере )Это что значит? "Выполнить на триггере" - это значит создать триггер.

isq1992И о чудо! Поле заполнилось)))))))))))))Наверняка просто невнимательность
...
Рейтинг: 0 / 0
SQL 2008
    #39587776
isq1992
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
может быть Вы правы. Но у меня еще иногда переконнект запаздывает. Изменения вступают в силу запоздало чуток, может комп слабый, а может я - невнимательная
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL 2008
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]