powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как передать в процедуру Select и также вернуть обратно табличную форму.
18 сообщений из 18, страница 1 из 1
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107757
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня, помогите пожалуйста найти решение.
Имеется таблица [Период], [Параметр], [Группа].
Группа возрастает с порядком месяца.
Задача состоит в том, чтобы переназначить группы с учетом условия - "если параметр в текущем месяце меньше 3 то нужно ему присвоить группу предыдущего, и так 2 раза (т.е. возможно объединение до 3х месяцев), если параметр больше 3 - группа остается неизменной".
Мне показалось, что я сделал это с помощью:
[параметр] < 3 and (LAG([параметр]) OVER(ORDER BY [группа] DESC) < 3
И так два раза. Но как оказалось все сыпется если будет много подряд параметров < 3.
Не вижу никакого способа это решить без процедуры, но дело в том, что эта таблица является select'ом и потом уходит в join к другой таблце, все это в длинном WITH.
Отсюда вопрос - как передать select в процедуру и отдать обратно на join? Если можно хотя бы структуру кода. Или может быть есть какое то альтернативное решение?
P.S. Таблица может быть очень большой.

Период Параметр Группа Обновленная группа07.2021 1 1 108.2021 2 2 109.2021 3 3 310.2021 1 4 411.2021 1 5 412.2021 1 6 4
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107760
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

если нумерация групп идёт без пропусков и предыдущая - это группа с меньшим номером, то текущий номер - 1 и будет предыдущая группа.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107763
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Да, все так. Но задача состоит в том что группы нужно объединять. До порога в 3 строки.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107772
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mellok14

"если параметр в текущем месяце меньше 3 то нужно ему присвоить группу предыдущего

Период Параметр Группа Обновленная группа10.2021 1 4 4


а почему тогда 4, а не 3 стоит?
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107780
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,

В том то и проблема, что 2 следюющих месяца группируются к этогому, и и теперь их общая сумма будет равна 3. И все они будут иметь группу 4. Т.е. переназначение групп идет с конца.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107782
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,

Т.е. задача не просто присвоить предыдущую группу если параметр меньше 3, а "сгруппировать" периоды чтобы сумма парметров была не меньше 3. Но не бесконечно это делать, а останавиваться, когда порог достигнут. В каком нибудь питоне это можно сделать с легкостью, но как в SQL это все запихнуть, я не понимаю.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107799
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

непонятно из описания и картинка тоже не проясняет какие такие объединения.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107807
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Ну вот же, 6я группа стала 4ой, 5я стала 4ой, 4я осталась 4ой. Столбец "Обновленная группа"..
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107811
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

а почему это произошло? И как были преобразованы остальные номера?
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107812
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Задача и состоит в том чтобы выполнить эту процедуру.
А произошло это потому что,
в декабре параметр имеет значение 1, значит его нужно отнести в одну группу с ноябрем.
в ноябре параметр тоже имеет значение 1, и в сумме с декабрем будет 2, значит оба месяца нужно отнести уже к группе Октября
в октябре параметр имеет значение 1, в сумме с предыдущими будет >= 3.
Значит группа сформирована: Декабрь, Ноябрь, Октябрь должны получить одну группу.

Сентябрь уже имеет параметр равный 3 - остается без изменения.

Август объединяется с Июлем, сумма будет 2. Был бы июнь - их нужно было бы объеденить с июнем.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107827
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

понятно, если долго не думать, то здесь проще всего применить итеративный подход, то есть организовав цикл по записям, например, курсором в обратном порядке относительно периодов. При этом надо запоминать номера ключей, которые будут обновлены найденным номером группы, затем таблицу ключей очищать и так пока не закончатся строки с курсоре.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107962
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Спасибо, скажите, а есть ли способ передать в процедуру результат Select и отдать из нее таблицу обратно? Без сохранния этого Select в отдельную таблицу ?
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40107964
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

Для того, чтобы передать процедуре набор данных, можно использовать табличный тип или преобразовать данные в XML.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40108205
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

Создаем тип. Он привязывается к базе данных. В другой базе придется пересоздавать.

Код: sql
1.
2.
3.
4.
5.
6.
CREATE TYPE dbo.MyTableType AS TABLE(
       fd_date date,
       fn_numeric int,
       fc_string varchar(500)
)
Go




Создаем процедуру, где указываем, что входной параметр будет нашего типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure sp_how_it_worked (
@param_table MyTableType READONLY
)
as 
begin

select * from @param_table

end
go



Далее используем:

Объявляем переменную нашего типа:
Код: sql
1.
declare @t as MyTableType



Наполняем данными:
Код: sql
1.
2.
3.
4.
insert into @t
select '2021-01-01', 10, 'C Новым Годом!'
union all
select '2021-03-06', 3, 'C 8 Марта!'


и сразу после наполнения, сразу вызываем процедуру

Код: sql
1.
exec sp_how_it_worked @t
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40108582
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Двоичник,

Спасибо большое, вроде начинает проясняться. Пара вопросов вопросов: вот когда я вызвал процедуру exec... - она мне вернет таблицу? Как ее сразу же отправить на Join к другой таблице?
И когда вы наполняете данными переменную - могу я ее наполнять не конкретными значениями через union all, а в виде одного selecta из другогой таблицы?
И похоже все таки это все предеться делать отдельно, в основное обобщенное табличное выражение exec, как я понимаю не запихнуть..
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40108593
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

авторвызвал процедуру exec... - она мне вернет таблицу? Как ее сразу же отправить на Join к другой таблице?

Используйте не процедуру, а табличную функцию.
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40108631
Mellok14
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

Спасибо большое, почитал - то что нужно. А момент с созданием "Типа" и записей текущей таблицы в переменную остается? И эта переменная (таблица) отправляется в табличную функцию?
...
Рейтинг: 0 / 0
Как передать в процедуру Select и также вернуть обратно табличную форму.
    #40108649
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mellok14,

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


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