Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 08:22   #1
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
Вопрос Минимальное и максимальное значение

Здравствуйте! Подскажите пожалуйста: составляю запрос на SQL Server. Выбираю данные из таблицы, в которой есть поле "Операции". Оно содержит в себе информацию о технологических операциях, с какой по какую выполнялись. Имеет примерно следующий вид: 001-010 (значит выполнялись операции с 001 по 010). Номера операций могут быть и не трехзначными, например 001,02-020. В общем смысл, что до тире идет первая операция, а после - конечная. Как мне можно их выделить в отдельные поля "Первая операция" и "Последняя операция"?
Swatch вне форума Ответить с цитированием
Старый 01.11.2012, 09:27   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Найти индекс дефиса в строке, а потом вытащить из строки то что ДО и ПОСЛЕ него в отдельные переменные
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 01.11.2012, 09:48   #3
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Спасибо, попробовала вот так:
Код:
left(Oper,charindex('-', Oper)-1) as NOP_min, substring(Oper, charindex('-',Oper)+1, Len(Oper)) as NOP_max
но выдает ошибку при запуске запроса :
Server: Msg 536, Level 16, State 3, Line 1
Invalid length parameter passed to the substring function. Не понимаю, что здесь не так.
Swatch вне форума Ответить с цитированием
Старый 01.11.2012, 09:51   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
substring(Oper, charindex('-',Oper)+1, Len(Oper))
substring третьим параметром (у вас - Len(Oper)) принимает количество символов, которые следует скопировать, а НЕ индекс последнего символа

Вы пытаетесь выцепить больше символов, чем осталось в строке. Отсюда и ошибка
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 01.11.2012, 09:54   #5
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

http://www.sql-tutorial.ru/ru/book_s..._function.html вот здесь я нашла такой вариант использования substring и Len, значит это неверно?
Swatch вне форума Ответить с цитированием
Старый 01.11.2012, 09:56   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

substring(Oper, charindex('-',Oper)+1, Len(Oper)-charindex('-',Oper))
лучше так
RIGHT(Oper,Len(Oper)-charindex('-',Oper))
а еще лучше в базе держать нормальные поля и не мучаться потом с парсингом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.11.2012, 10:00   #7
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

Спасибо за помощь! Вот как раз и делаю нормальные поля из ненормальных
Swatch вне форума Ответить с цитированием
Старый 01.11.2012, 10:04   #8
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

а нет.... опять такую же ошибку выдает....
Swatch вне форума Ответить с цитированием
Старый 01.11.2012, 10:06   #9
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Надо запрос целиком смотреть
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 01.11.2012, 10:07   #10
Swatch
Форумчанин
 
Регистрация: 05.07.2009
Сообщений: 209
По умолчанию

select Cex_code, Ych_Code, Zona_Code, NomNar_Det, PutDet, ObozDet, NaimDet, Prizvar, PrizGr, Data, Kol, BarCode_Det, Oper, EdNorm,
left(Oper,charindex('-', Oper)-1) as NOP_min, substring(Oper, charindex('-',Oper)+1, (Len(Oper)-charindex('-',Oper))) as NOP_max,
sum(convert(decimal(13,4),Trud/Power(10,(case when EdNorm Is Null Or EdNorm=4 then 0 else EdNorm end)))*Kol) as Trud from СО_Наряды where Cex_Code='54' and
Data>='27.09.2012' and Data<= '26.10.2012' group by Cex_code, Ych_Code, Zona_Code, NomNar_Det, PutDet, ObozDet, NaimDet, Prizvar, PrizGr, Data, Kol,
BarCode_Det, Oper, EdNorm, left(Oper,charindex('-', Oper)-1), substring(Oper, charindex('-',Oper)+1, (Len(Oper)-charindex('-',Oper)))
Swatch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Минимальное и максимальное значение в массиве. С++ Enigmya Помощь студентам 3 17.10.2011 16:07
Нужно вывести максимальное и минимальное значение из матрицы Aleksey1924 Помощь студентам 8 25.04.2011 12:46
максимальное и минимальное значение заданных чисел солнышко777 Паскаль, Turbo Pascal, PascalABC.NET 1 28.09.2010 16:29
Определить максимальное/минимальное значение функции y=f(x) astrozombie Помощь студентам 2 16.02.2009 13:52