powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать последнюю запись
13 сообщений из 13, страница 1 из 1
Выбрать последнюю запись
    #39993564
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги!
Имеется таблица
ID - ключевое поле (счетчик)
GroupName - nvarchar(100)

В поле GroupName, как следует из названия, содержится номер группы.
Все бы ничего, но номер группы может быть не только 1,2,3 и т.д., но и 2/1, 2/В ...
Была организована табличная функция, которая возвращает сортированный список групп
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ALTER FUNCTION [dbo].[ufGetGroupList](@PayType int, @Year int)

RETURNS TABLE 
AS
RETURN 
(
	-- Add the SELECT statement with parameter references here
SELECT TOP(100) PERCENT fGroupName FROM dbo.tGroupsName WHERE ((fYear = 2019) AND (fIDEduPay = 1))
		ORDER BY RIGHT(REPLICATE('0',10)+ISNULL(LEFT(fGroupName, NULLIF(PATINDEX('%[^0-9]%', fGroupName),0)-1),fGroupName),10),
		STUFF(fGroupName,1, NULLIF(PATINDEX('%[^0-9]%',fGroupName),0)-1,'')  asc
)



Задача стоит получить последний номер группы (в текущей базе есть номера от 1 до 50)
Запрос типа такого, возвращает упорно 9
Код: sql
1.
select top(1) * from dbo.ufgetgrouplist(1,2019) order by fGroupName desc



Подскажите, пожалуйста, как выкрутиться в этой ситуации. Сервер 2008 R2
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39993570
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Научите вашего архитектора БД разделять в таких случаях одно поле с составным номером на несколько, чтобы можно было писать по-человечески order by.

Функция шедеврально бесполезна. Но если уж очень хочется, то ваша функция как раз должна распиливать ваш GroupName на несколько полей, чтобы потом после вызова функции можно было сделать сортировку.

Ну или как-то так, если ваше длинное непонятное выражение про задание правльного порядка:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
ALTER FUNCTION [dbo].[ufGetGroupList](@PayType int, @Year int)

RETURNS TABLE 
AS
RETURN 
(
	-- Add the SELECT statement with parameter references here
SELECT 
    fGroupName
    , fGroupNameOrd = RIGHT(REPLICATE('0',10)+ISNULL(LEFT(fGroupName, NULLIF(PATINDEX('%[^0-9]%', fGroupName),0)-1),fGroupName),10),
		STUFF(fGroupName,1, NULLIF(PATINDEX('%[^0-9]%',fGroupName),0)-1,'')

FROM dbo.tGroupsName WHERE ((fYear = @Year) AND (fIDEduPay = @PayType))

)
go
select top(1) * from dbo.ufgetgrouplist(1,2019) order by fGroupNameOrd desc
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39993657
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

создайте таблицу сортировки, по ней и сортируйте. Таблицу можно заранее заполнять или по ходу появления новых значений.
Заполните с шагом в 1000, например.
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39993663
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К тому же TOP(100) PERCENT ... ORDER BY ... сервер игнорирует.
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39993664
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Select top (select 100) percent ... order by не игнорирует.
Во всяком случае - пока.
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39993727
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
ваша функция как раз должна распиливать ваш GroupName на несколько полей

Версия сервер какая?
В современным скулях есть замечательная функция SPLIT_STRING (насколько помню её название).
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39993737
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008
Гавриленко Сергей Алексеевич
ваша функция как раз должна распиливать ваш GroupName на несколько полей

Версия сервер какая?
В современным скулях есть замечательная функция SPLIT_STRING (насколько помню её название).
Он же написал
edward_sh
Сервер 2008 R2
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39994776
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, джентельмены!
По совету бывалых товарищей разбил поле номер группы на числовое значение и строковый довесок.
Теперь всплыла другая проблема, с ходу которую я не понял как решить. Прошу помощи зала.
Теперь мы имеем
@Name int
@NameExt nvarchar(10)
@Year int
@PayType int

Мне надо проверить, существует ли группа с таким номером (Name+NameExt) в году (Year) с типом (PayType)
Ранее все было боле-менее понятно, подставляем в поле запроса переменную с именем группы - получаем результат.
При разведения поля имени группы на составляющие части как правильно подменить условие отбора в поле where для NameExt,
учитывая, что там может быть как текст, так и значение NULL? Группа с дополнительным номером в виде текста есть, есть такая же группа, но с полем NULL. Т.е. группа 28 NULL и группа 28 /1
Попробовал лепить строку динамического SQL, но она не прокатывает с IF EXIST - ругается ошибкой.

Ранее было
Код: sql
1.
2.
3.
4.
IF EXISTS (SELECT * FROM dbo.tGroupsName
		WHERE
			(dbo.tGroupsName.fGroupName = @Name AND dbo.tGroupsName.fGroupNameExt = @NameExt AND
			dbo.tGroupsName.fIDEduPay = @EduPay AND dbo.tGroupsName.fYear = @Year))
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39995215
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
edward_sh, попробуйте так:
Код: sql
1.
2.
3.
4.
5.
IF EXISTS (SELECT dbo.tGroupsName.fGroupName, dbo.tGroupsName.fGroupNameExt, dbo.tGroupsName.fIDEduPay, dbo.tGroupsName.fYear
			FROM dbo.tGroupsName
			intersect
			Select @Name, @NameExt, @EduPay, @Year
			)
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39995266
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые доны и джентельмены!
Приведя таблицу "по фэншую" столкнулся со значительным увеличением геморроя для выборки записей. Кол-во кода увеличилось значительно, по сравнению с первоначальным вариантом. Решил вернуться к текстовому полю, где и имя группы и ее расширение (возможное) будут в одном поле.
Так что не всегда "фэншуй" полезен...
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39995279
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Уважаемые доны и джентельмены!
Приведя таблицу "по фэншую" столкнулся со значительным увеличением геморроя для выборки записей. Кол-во кода увеличилось значительно, по сравнению с первоначальным вариантом. Решил вернуться к текстовому полю, где и имя группы и ее расширение (возможное) будут в одном поле.
Так что не всегда "фэншуй" полезен...
С ростом кол-ва данных то, что вы называете "феншуем", становится необходимостью. А на тысяче записей можно не заморачиваться и по-простому говнокодить, не вопрос.
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39995346
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один знакомый держит календарь выходных в виде '01' в текстовом поле и ничего, как-то работает.
...
Рейтинг: 0 / 0
Выбрать последнюю запись
    #39995388
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Кол-во кода увеличилось значительно, по сравнению с первоначальным вариантом.
Так что не всегда "фэншуй" полезен...


Если в ваши должностные обязанности не входит написание кода, то можно и так обойтись.
Если же входит - то это и не этично и не практично запоминать и реализовывать заведомо проблемный патерн.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выбрать последнюю запись
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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