Aby ustawić skonsolidowane zarządzanie kontem, chcę się dowiedzieć, że konta mają "dokładnie taki sam" zestaw właścicieli.Jak mogę znaleźć grupy rekordów, które pasują do innych grup rekordów (podział relacyjny?)
Myślę, że może to działać, aby przestawić właścicieli z dynamicznym sql, a następnie użyć funkcji rankingu , ale nie chcę realizować tego podejścia; Nie mam górnego limitu liczby nazw, które można powiązać z kontem podanym w , dlatego chcę uniknąć dynamicznego SQL.
moje dane (również to co 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')
Chcę dowiedzieć się, na każdym module-konta, co najniższa DDA konto jest to, że ma te same właścicieli z nim związane.
W przykładowych danych chciałbym te wyniki, trzecia kolumna to najniższe konto DDA, które ma tych samych właścicieli. Wyniki powinien mieć taką samą liczbę rzędów jak moduł/konta thereâ ponownego kombinacje - jednym rzędzie za każdym wierszu „SELECT moduł różne, odpowiadają OD 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 i 16 mają nie pasujące do żadnego DDA konto, więc nie ma znaczenia, że pasują do siebie nawzajem, uzyskują NULL dla konta do konsolidacji. EDYCJA: SVG 17 nie pasuje do niczego, mimo że istnieje akcent DDA, który ma wszystkie swoje posiadacze w SVG 17, kombinacja posiadaczy w SVG 17 nie występuje dla żadnego akta DDA. Każde konto DDA pasuje do siebie, chyba że istnieje konto dda o tym samym właścicielu i niższym DDA (tak jak w przypadku DDA 222).
Widzę, że jednym z ogólnych podejść jest przestawianie każdego konta, grupy w tabeli przestawnej i użycie parametru numer_wiersza. Biorąc pod uwagę nieograniczoną liczbę posiadaczy powiązanych z każdym kontem, myślę, że obracanie wymagałoby dynamicznego SQL, którego wolałbym uniknąć.
Wydaje mi się, że jest to problem "relacji z relacjami", z podziałem relacyjnym prawdopodobnie "nakarmionym" przez APLIKACJĘ KRZYŻOWĄ. Wypróbowałem napisanie funkcji, która zajęłaby tabelę posiadaczy rachunków powiązaną z konkretnym kontem i znalazłem najniższe konto dda, wzdłuż linii pokazanej poniżej, celem było sprawdzenie, czy cała liczba osób w danym Konto jest takie samo, jak liczba osób, które dołączyły konto do danego konta dda, ale nie wiem, jak "zasilić" tabele z numerami kont w tej funkcji.
-- 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;
uwaga, że „Chase, Billie” w wierszu 606 DDA nie jibe z wynikowego mówisz, że chcesz z powrotem ; Myślę, że chcesz, żeby to było "Chase, Billy", prawda? – mwigdahl
Tak, to prawda, przepraszam za to, i dziękuję, będę ponownie edytować teraz –