Для настройки обработки консолидированных учетных записей я хочу найти учетные записи, у которых «точно такой же» набор владельцев.
Я думаю, что может сработать поворот владельцев с помощью динамического sql, а затем использование функций ранжирования, но я не хочу использовать этот подход; У меня нет верхнего предела количества имен, которые можно связать с данной учетной записью, поэтому я хочу избежать динамического SQL.
Мои данные (также они находятся по адресу http://www.sqlfiddle.com/#!3/1d36e< /а>)
CREATE TABLE allacctRels
(account INT NOT NULL,
module CHAR(3) NOT NULL,
custCode CHAR(20) NOT NULL)
INSERT INTO allacctrels
(account, module, custCode)
VALUES
(1, 'DDA', 'Wilkie, Walker'),
(1, 'DDA', 'Houzemeal, Juvy'),
(2, 'CDS', 'Chase, Billy'),
(2, 'CDS', 'Norman, Storm'),
(3, 'CDS', 'Chase, Billy'),
(3, 'CDS', 'Norman, Storm'),
(7, 'CDS', 'Perkins, Tony'),
(15, 'SVG', 'Wilkie, Walker'), --typo in name before mwigdahl's response
(16, 'SVG', 'Wilkie, Walker'), -- corrected typo here too
(606, 'DDA', 'Norman, Storm'),
(606, 'DDA', 'Chase, Billy'),-- corrected 2nd typo found
(4, 'LNS', 'Wilkie, Walker'),
(4, 'LNS', 'Houzemeal, Juvy'),
(44, 'DDA', 'Perkins, Tony'),
(222, 'DDA', 'Wilkie, Walker'),
(222, 'DDA', 'Houzemeal, Juvy'),
(17, 'SVG', 'Wilkie, Walker'), -- added these three rows in edit, SVG 17 doesn't match any dda
(17, 'SVG', 'Welch, Raquel'),
(17, 'SVG', 'Houzemeal, Juvy')
Я хочу выяснить для каждого MODULE-ACCOUNT, какая самая низкая учетная запись DDA имеет точно таких же владельцев, связанных с ней.
В примере данных мне нужны эти результаты, третий столбец — это самая низкая учетная запись DDA, имеющая тех же владельцев. В результатах должно быть столько же строк, сколько и в комбинациях модуль/учетная запись — по одной строке на каждую строку в «SELECT DISTINCT module, account FROM allAcctRels»)
1, DDA, 1
2, CDS, 606
3, CDS, 606
15, SVG, NULL
16, SVG, NULL
606, DDA, 606
4, LNS, 1
7, CDS, 44
44, DDA, 44
222, DDA, 1
17, SVG, NULL -- added to original post.
SVG 15 и 16 не соответствуют ни одной учетной записи DDA, поэтому не имеет значения, совпадают ли они друг с другом, они получают NULL для учетной записи, с которой нужно объединиться. РЕДАКТИРОВАТЬ: SVG 17 ничего не соответствует, несмотря на то, что существует счет DDA, все держатели которого включены в SVG 17, комбинация держателей в SVG 17 не происходит ни для одного счета DDA. Каждая учетная запись DDA будет соответствовать самой себе, если только не существует учетная запись DDA с теми же владельцами и меньшим DDA (как в случае DDA 222).
Я вижу, что один общий подход состоит в том, чтобы свести каждую учетную запись, сгруппировать сводную таблицу и использовать row_number. Учитывая неограниченное количество держателей, связанных с каждой учетной записью, я думаю, что для поворота потребуется динамический SQL, которого я бы предпочел избежать.
Мне кажется, что это проблема "реляционного деления", при этом относительное деление, вероятно, "подпитывается" КРЕСТНЫМ ПРИМЕНЕНИЕМ. Я попытался написать функцию, которая брала бы таблицу владельцев учетных записей, связанных с определенной учетной записью, и находила учетную запись с наименьшим значением DDA в соответствии с линиями, показанными ниже, идея заключалась в том, чтобы увидеть, одинаково ли все количество людей в данной учетной записи. как количество людей, когда эта учетная запись присоединена к данной учетной записи dda, но я не могу понять, как «подавать» таблицы номеров учетных записей в функцию.
-- this is what I tried but I'm not sure it the logic would work
-- and I can't figure out how to pass the account holders for each
-- account in. This is a bit changed from the function I wrote, some
-- extraneous fields removed and cryptic column names changed. So it
-- probably won't run as is.
-- to support a parameter type to a tape
-- CREATE type VisionCustomer as Table
-- (customer varchar(30))
CREATE FUNCTION consolidatable
(@custList dbo.VisionCustomer READONLY)
RETURNS char(10)
AS
BEGIN
DECLARE @retval Varchar(10)
DECLARE @howmany int
select @howmany=Count(*) FROM @custlist;
SELECT @retval = min (acct) FROM allAcctRels
JOIN @custlist
On VendorCustNo = Customer
WHERE acctType = 'DDA'
GROUP BY acct
HAVING (count(*) = @howmany)
and
COUNT(*) = (select Count(*) FROM allAcctRels X
WHERE X.acctType = 'DDA'
AND X.account = AllAcctRels.account) ;
RETURN @retval
END;