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

Откуда:
Сообщений: 131
Добрый день!

Ребята, подскажите как реализовать следующее
есть документ 1 у него есть история, хочу проставить в новой колонке другое значение

таблица 1

Документ История хочу получить следующее


1 группа А if поле = группа А to группа А
1 сотрудник В группа А
1 дата создания группа А
1 группа D группа А
1 ......C группа D
1 ..... H группа D
7 апр 14, 20:42    [15846031]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume , пункты 4 и 6.
7 апр 14, 20:45    [15846043]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
колонка 1 -- №1(документ)
колонка 2 -- группа или любая срока в документе
колонка 3 -- результат (если в истории есть строка группа А, то проставить значение этой группе всем строкам ниже до следующего значения группа)
7 апр 14, 20:55    [15846083]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
D_r_a_g_o_n
колонка 1 -- №1(документ)
колонка 2 -- группа или любая срока в документе
колонка 3 -- результат (если в истории есть строка группа А, то проставить значение этой группе всем строкам ниже до следующего значения группа)
15846043, читать, пока не дойдет.
7 апр 14, 21:05    [15846113]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Microsoft SQL Server 2005 - 9.00.4053.00 (X64)
May 26 2009 14:13:01
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)


drop table #document
create table #document
( SER_ID decimal(18,0),
  PER_NAME nvarchar(255),
  SUBJECT nvarchar(255)
)
insert into #document values ('2821756',N'Администратор',N'Группа "А"');
insert into #document values ('2821756',N'Иванова Ольга Анатольевна',N'Другие данные');
insert into #document values ('2821756',N'Иванова  Ольга Анатольевна',N'Другие данные');
insert into #document values ('2821756',N'Иванова Ольга Анатольевна',N'Другие данные');
insert into #document values ('2821756',N'Иванова  Ольга Анатольевна',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'',N'Группа "А"');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Группа "А"');
insert into #document values ('2821756',N'Рыбин Павел Федорович',N'Другие данные');	

select *
from #document

--Хочу получить такой результат
	create table #doc
	(						SER_ID decimal(18,0),
							PER_NAME nvarchar(255),
							SUBJECT nvarchar(255),
							Rez nvarchar(255)
	)
insert into #doc values ('2821756',N'Администратор',N'Группа "А"',N'Группа "А"');
insert into #doc values ('2821756',N'Иванова Ольга Анатольевна',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Иванова  Ольга Анатольевна',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Иванова Ольга Анатольевна',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Иванова  Ольга Анатольевна',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Группа "В"',N'Группа "В"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "В"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Группа "А"',N'Группа "А"');
insert into #doc values ('2821756',N'Рыбин Павел Федорович',N'Другие данные',N'Группа "А"');	

select *
From #doc


Сообщение было отредактировано: 8 апр 14, 08:43
8 апр 14, 08:34    [15847187]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
И каким образом одна запись ('2821756',N'Рыбин Павел Федорович',N'Другие данные') попадает в группу А, а совершенна такая же запись ('2821756',N'Рыбин Павел Федорович',N'Другие данные') попадает в группу B?

На приведенных данных задача малорешаема, да и алгоритм получения все еще туманен.
8 апр 14, 08:46    [15847219]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
есть группы А и B, которые содержат набор персон. Персоны могут быть в 2 группах.
самый простой пример: есть документ который решает Группа "А" потом передают на группу Группа "В"
8 апр 14, 08:58    [15847248]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
D_r_a_g_o_n
колонка 3 -- результат (если в истории есть строка группа А, то проставить значение этой группе всем строкам ниже до следующего значения группа)
Для решения нужно поле, по которому можно отсортировать строки.
А то строки в таблице - это наваленная куча записей, и невозможно понять, где "ниже до следующего значения".
Хотя бы инкрементный суррогатный ключ сделайте, что ли, либо дату.
8 апр 14, 08:58    [15847249]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
есть дата
8 апр 14, 09:05    [15847262]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2407
D_r_a_g_o_n
есть дата

почему этого поля (даты) нету в вашей табле #document ?
8 апр 14, 09:56    [15847372]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
тут простой пример, ели надо могу добавить
8 апр 14, 10:01    [15847398]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
D_r_a_g_o_n
есть дата
create table #document
(	[Data] datetime,
	SER_ID decimal(18,0),
	PER_NAME nvarchar(255),
	SUBJECT nvarchar(255)
)
insert into #document values ('20140408 10:00', '2821756',N'Администратор',N'Группа "А"');
insert into #document values ('20140408 10:01', '2821756',N'Иванова Ольга Анатольевна',N'Другие данные');
insert into #document values ('20140408 10:02', '2821756',N'Иванова  Ольга Анатольевна',N'Другие данные');
insert into #document values ('20140408 10:03', '2821756',N'Иванова Ольга Анатольевна',N'Другие данные');
insert into #document values ('20140408 10:04', '2821756',N'Иванова  Ольга Анатольевна',N'Другие данные');
insert into #document values ('20140408 10:05', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:06', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:07', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:08', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:09', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:10', '2821756',N'',N'Группа "B"');
insert into #document values ('20140408 10:11', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:12', '2821756',N'Рыбин Павел Федорович',N'Другие данные');
insert into #document values ('20140408 10:13', '2821756',N'Рыбин Павел Федорович',N'Группа "C"');
insert into #document values ('20140408 10:14', '2821756',N'Рыбин Павел Федорович',N'Другие данные');	

select *, (select top 1 s.SUBJECT from #document s where s.Data <= d.Data and s.SUBJECT like N'Группа %' order by s.Data DESC) as Rez
from #document d
go
drop table #document
8 апр 14, 10:02    [15847407]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
спасибо
8 апр 14, 10:05    [15847428]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
можно словами рассказать что сделали?
8 апр 14, 10:11    [15847458]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
D_r_a_g_o_n
можно словами рассказать что сделали?
Всё же примитивно, T-SQL - это описание словами, только английскими :-)

Для каждой записи нахожу ближайшую предыдущую запись, у которой SUBJECT начинается на "Группа"

select top 1 -- найти одну запись
from #document s -- из той же таблицы
where s.Data <= d.Data -- предыдущая
and s.SUBJECT like N'Группа %' -- у которой SUBJECT начинается на "Группа"
order by s.Data DESC -- ближайшая
8 апр 14, 10:17    [15847495]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Получилось, большое спасибо
8 апр 14, 10:31    [15847594]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 653
присвоить alexeyvg звание телепата форума =).

Есть ощущение, что все-таки требуется группировка по сотруднику/персоне?
Нет?

Или все сотрудники/персоны данной таблицы "живут" всегда в одной группе?
8 апр 14, 11:12    [15847917]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
alexeyvg, подскажите нужно делать в
where s.documentid = d.documentid
8 апр 14, 11:31    [15848040]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
D_r_a_g_o_n
alexeyvg, подскажите нужно делать в
where s.documentid = d.documentid
Чего? У вас нету такого поля в таблице.
Я не настолько телепат :-)

Обычно задача формулируется на русском языке, смотрится логическая и физическая модель данных. Потом уже по постановке задачи и по моделям пишутся запросы.
8 апр 14, 11:37    [15848105]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
D_r_a_g_o_n
Member

Откуда:
Сообщений: 131
Согласен с Вами alexeyvg
Нужно ли делать в WHERE сравнение по полю SER_ID
Мы делали сравнение для одного документа.


select top 1 -- найти одну запись
from #document s -- из той же таблицы
where s.Data <= d.Data -- предыдущая
and s.SUBJECT like N'Группа %' -- у которой SUBJECT начинается на "Группа"
order by s.Data DESC -- ближайшая
8 апр 14, 11:45    [15848158]     Ответить | Цитировать Сообщить модератору
 Re: Помощь  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
D_r_a_g_o_n
Нужно ли делать в WHERE сравнение по полю SER_ID
Мы делали сравнение для одного документа.
Ну, если нужно для одного документа, то да, просто добавьте условие в подзапрос: AND s.SER_ID = d.SER_ID
8 апр 14, 11:51    [15848222]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить