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

Откуда:
Сообщений: 199
Добрый день, господа.

Вообщем, в MS SQL Server 2008 есть следующая таблица:
CRM_ID NAME INN CODE PRIORITY DATA_SOURCE
1-AQQName_011117658CC0143
1-AQQName_011117658PF34
1-AQQName_011117658PF_CON11
2-FCCName_226664321PF_CON11
2-FCCName_226664321PF34
2-FCCName_226664321CC0243
3-GTTName_337372124CC0342

Необходимо извлечь из нее записи, минуя дубликаты, то бишь получить для каждого уникального значения поля INN все остальные значения, при условии, что для одного уникального INN есть несколько разных CODE. Данные для каждого поля выбираются в соответствии с полем DATA_SOURCE - наименьшее значение имеет высший приоритет. За исключением поля CODE - там записи берутся по приоритету значений поля PRIORITY - чем больше значение, тем выше приоритет. В итоге мы должны получить следующее:
CRM_ID NAME INN CODE PRIORITY DATA_SOURCE
1-AQQName_011117658CC0141
2-FCCName_226664321CC0241

Делаем мы это посредством хардкода с выбором ТОП 1 записи в пределах каждого INN:
SELECT CRM_ID.CRM_ID, NAME.NAME, DISTINCT_INN.INN, CODE.CODE, PRIORITY.PRIORITY, DATA_SOURCE.DATA_SOURCE
FROM
(SELECT DISTINCT(INN) FROM dbo.testMS WHERE INN IN (SELECT INN FROM dbo.testMS WHERE INN IS NOT NULL GROUP BY INN HAVING COUNT(DISTINCT(CODE)) > 1)) AS DISTINCT_INN
OUTER APPLY
	(SELECT TOP 1 * FROM dbo.testMS WHERE dbo.testMS.CRM_ID IS NOT NULL AND DISTINCT_INN.INN = dbo.testMS.INN
		ORDER BY DATA_SOURCE ASC) AS CRM_ID
OUTER APPLY
	(SELECT TOP 1 * FROM dbo.testMS WHERE dbo.testMS.NAME IS NOT NULL AND DISTINCT_INN.INN = dbo.testMS.INN
		ORDER BY DATA_SOURCE ASC) AS NAME
OUTER APPLY
	(SELECT TOP 1 * FROM dbo.testMS WHERE dbo.testMS.CODE IS NOT NULL AND DISTINCT_INN.INN = dbo.testMS.INN
		ORDER BY PRIORITY DESC) AS CODE
OUTER APPLY
	(SELECT TOP 1 * FROM dbo.testMS WHERE dbo.testMS.PRIORITY IS NOT NULL AND DISTINCT_INN.INN = dbo.testMS.INN
		ORDER BY PRIORITY DESC) AS PRIORITY
OUTER APPLY
	(SELECT TOP 1 * FROM dbo.testMS WHERE dbo.testMS.DATA_SOURCE IS NOT NULL AND DISTINCT_INN.INN = dbo.testMS.INN
		ORDER BY DATA_SOURCE ASC) AS DATA_SOURCE


Проблема в том, что после того, как мы получили по одной записи для каждого INN и занесли их в определенную таблицу, оставшиеся записи нужно вынести в другую таблицу, и как сделать это, я не представляю. Буду рад любой помощи, спасибо.
15 авг 13, 12:23    [14712237]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
SiNtez_26,
а вы напишите второй резалт сет который должен получиться после
автор
CRM_ID NAME INN CODE PRIORITY DATA_SOURCE
1-AQQ Name_01 1117658 CC01 4 1
2-FCC Name_22 6664321 CC02 4 1

а то не совсем понятно что есть
автор
оставшиеся записи нужно вынести в другую таблицу,
15 авг 13, 12:32    [14712342]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
CRM_IDNAMEINNCODEPRIORITYDATA_SOURCE
1-AQQName_011117658PF34
1-AQQName_011117658PF_CON11
2-FCCName_226664321PF_CON11
2-FCCName_226664321PF34


То есть, говоря простыми словами - первая таблица содержит уникальные записи по каждому INN, если CODE для одного INN несколько, а вторая содержит остальные записи в связке INN - CODE, которые не вошли в первую
15 авг 13, 12:36    [14712391]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
SiNtez_26
Делаем мы это посредством хардкода с выбором ТОП 1 записи в пределах каждого INN:

Офигеть. А что попроще через ражирующую функцию нельзя ?

SiNtez_26
оставшиеся записи нужно вынести в другую таблиц

А что такое "оставшиеся записи", если в выборке часть полей от одной записи, а часть - от другой ?
15 авг 13, 12:37    [14712394]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
снова про шаблон отчета на нескольких страницах :) ?
15 авг 13, 12:37    [14712399]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Для
CODE - нумерумем по PRIORITY
Для всех сотальных по DATA_SOURCE

Зачем у вас 4 подзапроса то ?
15 авг 13, 12:38    [14712410]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
ergergrege
Guest
SiNtez_26,
запрос можно проще или виндов функциями или еще проще
with c(CRM_ID,	NAME,	INN,	CODE,	PRIORITY,	DATA_SOURCE)
as
(
select '1-AQQ',	'Name_01',	1117658,	'CC01',	4,	3 union all
select '1-AQQ',	'Name_01',	1117658,	'PF',	3,	4 union all
select '1-AQQ',	'Name_01',	1117658,	'PF_CON',	1,	1 union all
select '2-FCC',	'Name_22',	6664321,	'PF_CON',	1,	1 union all
select '2-FCC',	'Name_22',	6664321,	'PF',	3,	4 union all
select '2-FCC',	'Name_22',	6664321,	'CC02',	4,	3 union all
select '3-GTT',	'Name_33',	7372124,	'CC03',	4,	2
)
select
	crm_id,
	name,
	inn,
	substring(max(str([priority], 1) + code collate Latin1_General_BIN2), 1, 1) as priority,
	substring(max(str([priority], 1) + code collate Latin1_General_BIN2), 2, 1000) as code,
	min(data_source) as data_source
from c
group by crm_id, name, inn;
15 авг 13, 12:40    [14712429]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Glory
А что такое "оставшиеся записи", если в выборке часть полей от одной записи, а часть - от другой ?

В итоге разными являются только CODE. То бишь одна запись с максимальным PRIORITY для CODE в первой таблице - остальные во вторую
15 авг 13, 12:40    [14712435]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
SiNtez_26
Glory
А что такое "оставшиеся записи", если в выборке часть полей от одной записи, а часть - от другой ?

В итоге разными являются только CODE. То бишь одна запись с максимальным PRIORITY для CODE в первой таблице - остальные во вторую

Нет. Еще и PRIORITY поле у вас из разных записей
15 авг 13, 12:46    [14712484]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
По полю PRIORITY мы просто определяем какой CODE отправить в первую таблицу. Итогового значения во второй он не имеет.
15 авг 13, 12:50    [14712523]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
SiNtez_26
По полю PRIORITY мы просто определяем какой CODE отправить в первую таблицу.

Еще раз
У вас _в результате_ часть полей(часть - это больше одного) из одной записи, а часть(опять больше одного) - из другой
Сколько там полей из каких записей _в условиях отбора_ совершенно безразлично.
15 авг 13, 12:54    [14712547]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
declare @t table(

RM_ID varchar(50),	NAME varchar(50),	INN	 varchar(50), CODE varchar(50),	PRIORITY int,	DATA_SOURCE int)
insert into @t(RM_ID,NAME,INN,CODE,PRIORITY,DATA_SOURCE)
values
('1-AQQ',	'Name_01',	'1117658',	'CC01'	,4	,3)
,('1-AQQ',	'Name_01',	'1117658',	'PF',	3,	4)
,('1-AQQ',	'Name_01',	'1117658',	'PF_CON',	1	,1)
,('2-FCC',	'Name_22',	'6664321',	'PF_CON',	1,	1)
,('2-FCC',	'Name_22',	'6664321',	'PF'	,3,	4)
,('2-FCC',	'Name_22',	'6664321',	'CC02'	,4,	3)
,('3-GTT',	'Name_33',	'7372124',	'CC03'	,4,	2)

;with RenumberPrior as
(
select
RM_ID
,NAME
,INN
,CODE
,PRIORITY = ROW_NUMBER() over (PARTITION  by inn order by PRIORITY desc)
,DATA_SOURCE
from @t
)
-- первый набор
select r.CODE, t.RM_ID,t.INN,t.NAME
from	RenumberPrior r
		inner join @t t
		on t.INN = r.INN
			and t.DATA_SOURCE =1
where r.PRIORITY =1		

-- второй набор
;with RenumberPrior as
(
select
RM_ID
,NAME
,INN
,CODE
,PRIORITY = ROW_NUMBER() over (PARTITION  by inn order by PRIORITY desc)
,DATA_SOURCE
from @t
)

select *
from RenumberPrior
where PRIORITY>1

вот например такой вариант. Способов вообще можно много придумать.
15 авг 13, 12:59    [14712591]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
NN CRM_ID NAME INN CODE PRIORITY DATA_SOURCE
11-AQQName_011117658CC0143
21-AQQName_011117658PF34
31-AQQName_011117658PF_CON11


У вас
CRM_ID, NAME, DATA_SOURCE взяты из записи номер_3
а
CODE, PRIORITY взяты из записи номер_1

Что вы это случае есть "оставшиеся записи" ?
15 авг 13, 13:01    [14712603]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Glory
NN CRM_ID NAME INN CODE PRIORITY DATA_SOURCE
11-AQQName_011117658CC0143
21-AQQName_011117658PF34
31-AQQName_011117658PF_CON11


У вас
CRM_ID, NAME, DATA_SOURCE взяты из записи номер_3
а
CODE, PRIORITY взяты из записи номер_1

Что вы это случае есть "оставшиеся записи" ?

автор
То есть, говоря простыми словами - первая таблица содержит уникальные записи по каждому INN, если CODE для одного INN несколько, а вторая содержит остальные записи в связке INN - CODE, которые не вошли в первую
15 авг 13, 13:03    [14712618]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Мистер Хенки, действительно, код делает то, что нужно. Безграничное вам спасибо!
15 авг 13, 13:04    [14712623]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
Мистер Хенки
автор
То есть, говоря простыми словами - первая таблица содержит уникальные записи по каждому INN, если CODE для одного INN несколько, а вторая содержит остальные записи в связке INN - CODE, которые не вошли в первую

Т.е. условие "Данные для каждого поля выбираются в соответствии с полем DATA_SOURCE - наименьшее значение имеет высший приоритет. " просто для отвода глаз ? Чтобы было не так просто ?
15 авг 13, 13:05    [14712641]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Нет, иногда бывает различаются значения поля NAME для одного INN. Я вот не понимаю, чего вы хотите и пытаетесь добиться.
15 авг 13, 13:08    [14712667]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
SiNtez_26
Я вот не понимаю, чего вы хотите и пытаетесь добиться.

Внятного объяснения задачи
Которую вы, судя по истории ваших вопросов, решаете уже 2 недели
Запрос, который вам предложил Мистер Хенки, был дан им же в предыдущей вашей теме
15 авг 13, 13:10    [14712694]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Glory
SiNtez_26
Я вот не понимаю, чего вы хотите и пытаетесь добиться.

Внятного объяснения задачи
Которую вы, судя по истории ваших вопросов, решаете уже 2 недели
Запрос, который вам предложил Мистер Хенки, был дан им же в предыдущей вашей теме

Нифига себе, а я их просто не запоминаю. Я даже и не помню ,что такое уже делал и именно автору.
15 авг 13, 13:13    [14712718]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
SiNtez_26
Member

Откуда:
Сообщений: 199
Задачи абсолютно разные. Схожими их можно посчитать только в случае незнания деталей, чего раскрывать нет смысла. Да и ответ не один и тот же. И вообще, предлагаю прекратить эту бессмысленную перепалку и заняться чем-нибудь полезным, например.
15 авг 13, 13:15    [14712732]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
SiNtez_26
Задачи абсолютно разные.

Разумеется. Там выбрать, тут добавить.
Все совпадения имен таблиц и полей совершенно случайны.
SiNtez_26
И вообще, предлагаю прекратить эту бессмысленную перепалку и заняться чем-нибудь полезным, например.

Принимается
15 авг 13, 13:17    [14712749]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
bdsbdfbdfbfdbfd
Guest
00
SiNtez_26
Нет, иногда бывает различаются значения поля NAME для одного INN. Я вот не понимаю, чего вы хотите и пытаетесь добиться.


шерсть, об этом надо было написать в начале топика. тогда мой запрос не будет.

я по описанию понял

CRM_ID NAME INN -типа группы, для которой выбирается наименьший DATA_SOURCE (не равный 1 а наименьший) и CODE соответствующий максимальному PRIORITY

автор троль 99 lvl
15 авг 13, 13:23    [14712779]     Ответить | Цитировать Сообщить модератору
 Re: INSERT по условию в разные таблицы  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
bdsbdfbdfbfdbfd
00
SiNtez_26
Нет, иногда бывает различаются значения поля NAME для одного INN. Я вот не понимаю, чего вы хотите и пытаетесь добиться.


шерсть, об этом надо было написать в начале топика. тогда мой запрос не будет.

я по описанию понял

CRM_ID NAME INN -типа группы, для которой выбирается наименьший DATA_SOURCE (не равный 1 а наименьший) и CODE соответствующий максимальному PRIORITY

автор троль 99 lvl

точно, не заметил, что у автора в описании задачи и в тестовом результате несоответствие
первый набор данных правильнее так формировать
;with RenumberPrior as
(
select
RM_ID
,NAME
,INN
,CODE
,PRIORITY = ROW_NUMBER() over (PARTITION  by inn order by PRIORITY desc)
,DATA_SOURCE = ROW_NUMBER() over (PARTITION  by inn order by DATA_SOURCE asc)
from @t
)
-- первый набор
select r.CODE, t.RM_ID,t.INN,t.NAME

from	RenumberPrior r
		inner join RenumberPrior t
		on t.INN = r.INN
			and t.DATA_SOURCE =1
where r.PRIORITY =1		
15 авг 13, 13:30    [14712820]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить