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

Откуда:
Сообщений: 44
Подскажите, поалуйста. Почему второй 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

);
17 янв 18, 19:01    [21114743]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
isq1992, потому что end?
17 янв 18, 19:03    [21114750]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
... и не только... что хотите-то?
17 янв 18, 19:04    [21114752]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
isq1992,

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

до конца лень писать
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
17 янв 18, 19:05    [21114754]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
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 лишних
17 янв 18, 19:10    [21114761]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
Вам не else нужно, а словами рассказать, что вы тут городите.
17 янв 18, 19:14    [21114768]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
Гавриленко Сергей Алексеевич,

гороу вычисляемое поле. Оно заполняется по указанным критериям . Т.Е. важны только :
PrioritetCalc = 'Критическая ошибка' если в срок, то 10 если не в срок 3
Приоритет.PrioritetCalc= '1-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= '2-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 3-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 4-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Поле PrioritetCalc находится в таблице Приоритет. Новое поле создается в таблице Заявка, связянной с табл. ПРиоритет с вторичным ключем
17 янв 18, 19:19    [21114775]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
isq1992
Гавриленко Сергей Алексеевич,

гороу вычисляемое поле. Оно заполняется по указанным критериям . Т.Е. важны только :
PrioritetCalc = 'Критическая ошибка' если в срок, то 10 если не в срок 3
Приоритет.PrioritetCalc= '1-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= '2-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 3-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Приоритет.PrioritetCalc= 'Ошибка 4-го уровня' (по аналогии с крит ошиькой, но другие баллы )
Поле PrioritetCalc находится в таблице Приоритет. Новое поле создается в таблице Заявка, связянной с табл. ПРиоритет с вторичным ключем
Вам же уже написали вот тут 21114754
17 янв 18, 19:22    [21114778]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
isq1992,

я же написал тебе замену else, что ж не так
17 янв 18, 19:22    [21114779]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

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

потому что в каждой ветке OnTime = 0 (else) свои баллы. Или добавлять дополнительный when для условий, когда OnTime = 0 ?
17 янв 18, 19:27    [21114781]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
isq1992,

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

поэтому:
case 
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime = '1' then 10 
when Приоритет.PrioritetCalc = 'Критическая ошибка' and Заявка.Ontime <> '1' then 3
end
проверяет первое условие если истина то только в этом случае будет 10 (и на этом case закончится)
если не истина проверяем дальше вниз, второй when отличается от первого только Заявка.Ontime <> '1'
т.е. 3 балла будет только если "критическая и не в срок"
17 янв 18, 19:37    [21114787]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
case 
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime = '1' then 10
when Приоритет.PrioritetCalc = 'Консультация' and Заявка.Ontime <> '1' then 8
...

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

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
17 янв 18, 19:56    [21114813]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
а, оу, в заголовке 2008. ну тогда долгий и мучительный WHEN WHEN WHEN, а в конце the END
17 янв 18, 19:57    [21114816]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Хотя тут прослеживается чудовищная логика
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
17 янв 18, 19:59    [21114820]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
Руслан Дамирович,
а джойн где писать ? ИЛи условие where
У меня ругается на :
Не удалось привязать составной идентификатор "Приоритет.PrioritetCalc".
Т.Е, нужно соединение добавляю после до \после end - ругается. По идее это не Select -й запрос .
18 янв 18, 00:00    [21115152]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
isq1992
а джойн где писать ? ИЛи условие where
А с чего вы решили, что при создании вычисляемого поля можно писать join или where? Используете буйную фантазию вместо документации?
18 янв 18, 01:04    [21115192]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
isq1992
Руслан Дамирович,
а джойн где писать ? ИЛи условие where

Так это вам не вычисляемое поле нужно. А триггер уже
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
18 янв 18, 11:07    [21115837]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq_yar
Guest
Гавриленко Сергей Алексеевич, именно так ) как Вы догадались )
19 янв 18, 05:37    [21118498]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
Руслан Дамирович,

Огромное спасибо!!!
Отработало, но почему то значения 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
19 янв 18, 05:41    [21118499]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
Руслан Дамирович,
Вы не подскажите, почему триггер не работает? Даже для условия OnTime =1. Оно физически есть в БД, и значения тоже :(
20 янв 18, 23:50    [21123770]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
isq1992
Руслан Дамирович,
Вы не подскажите, почему триггер не работает? Даже для условия OnTime =1. Оно физически есть в БД, и значения тоже :(
А сам запрос данные возвращает? Не в триггере?
21 янв 18, 00:36    [21123838]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

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

запрос на выборку, да возвращает
21 янв 18, 01:07    [21123883]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
Руслан Дамирович, я вышла из базы, снова зашла - не работало. Написало парочку запросов UPDATE к другими столбцам. И о чудо! Поле заполнилось))))))))))))). Хотя до этого и сохраняла, и селекты с выборками различными делала - не в какую.... И несколько раз нажимала выполнить на запросе ( триггере ) Я думаю, зря я переименовала стобцы, не везде дошло до базы ). Большущее спасибо лично Вам за помощь !!!))))) И спасибо всем участникам ))))))))))))))) Вселенской моркови всем вам )))))))
21 янв 18, 03:43    [21123929]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
isq1992
И несколько раз нажимала выполнить на запросе ( триггере )
Это что значит? "Выполнить на триггере" - это значит создать триггер.

isq1992
И о чудо! Поле заполнилось)))))))))))))
Наверняка просто невнимательность
21 янв 18, 10:50    [21124080]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008  [new]
isq1992
Member

Откуда:
Сообщений: 44
alexeyvg,
может быть Вы правы. Но у меня еще иногда переконнект запаздывает. Изменения вступают в силу запоздало чуток, может комп слабый, а может я - невнимательная
21 янв 18, 11:23    [21124136]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить