2016-10-04 8 views
0

내에서 특정 행을 선택하는 것은 예를 들어 데이터 집합이 데이터는 시퀀스의 다양한 나타납니다SQL 서버 나 SQL 서버 아래에 2012을 사용하고 그룹

Prefix_Suffix First_Nm Last_Nm Acct_Registration_Line_1 Acct_Registration_Line_2 secondlevel TopLevel 
NULL Jane Smith NULL NULL smith1-rep abc-quarterly 
NULL John Smith NULL NULL smith1-rep abc-quarterly 
Jane Smith NULL NULL IRA FBO Jane Smith (EQUITY) PERSHING LLC AS CUSTODIAN smith1-rep abc-quarterly 
Jane Smith NULL NULL IRA FBO Jane Smith (FI) PERSHING LLC AS CUSTODIAN smith1-rep abc-quarterly 
John Smith NULL NULL IRA FBO John Smith (EQUITY) PERSHING LLC AS CUSTODIAN smith1-rep abc-quarterly 
John Smith NULL NULL IRA FBO John Smith (FI) PERSHING LLC AS CUSTODIAN smith1-rep abc-quarterly 

가, 때로는 어디 First_Nm (이름 만 행이에게있다) 및 Last_Nm (성)이 채워지고 Prefix_Suffix가 NULL입니다. 경우에 따라 Prefix_Suffix가 채워지고 이름과 성 필드는 NULL입니다. 모두 하나 또는 다른 모든 NULL 경우 처리 할 수 ​​있습니다. 내가 고민하는 행은 두 그룹 모두에서 NULL 시나리오가 나타나는 경우입니다. 그룹은 두 번째 레벨 열에 동일한 값을 가짐으로써 표시됩니다.

그룹 내 Prefix_Suffix에 값이 있고 성과 이름이 null 인 경우 & 또한 이름과성에 값이 들어 있고 Prefix_Suffix가 null 인 행이 있습니다. 그런 다음 Prefix_Sufix에 대한 값이있는 행을 원하지 않습니다. 그래서 예제 데이터 집합이 발생하면 Prefix_Suffix가 채워지는 4 개의 행을 제거하기 위해 필터를 적용하려고합니다. 다시 말하지만 Prefix_Suffix & First_nm, Last_Nm 사이에 NULLS가 번갈아 나타나는 그룹에서만이 결과를 원합니다. 여기

Prefix_Suffix First_Nm Last_Nm Acct_Registration_Line_1 Acct_Registration_Line_2 secondlevel TopLevel 
NULL Jane Smith NULL NULL smith1-rep abc-quarterly 
NULL John Smith NULL NULL smith1-rep abc-quarterly 

원하는 결과는 현재의 선택 문입니다. UNION ALL로 2 NULL 시나리오를 분리하려고했지만 충분하지 않았습니다.

WITH DATA AS 
(
SELECT *, 
COUNT(Acct_Nbr) OVER (PARTITION BY acct_nbr)AcctCount 
FROM ##temptable 
WHERE 1 = 1 
AND acct_holder_role_cd <> 'sec' 
) 
SELECT * 
INTO ##PrefixedAccounts 
FROM DATA 
WHERE AcctCount = 1 AND Last_Nm IS NULL; 
SELECT 
RcdTypId,Acct_Nbr,Acct_Short_Nm,Acct_Holder_Typ_Cd,Acct_Holder_Role_Cd, Prefix_Suffix 
,First_Nm,Middle_Nm,Last_Nm,Acct_Registration_Line_1,Acct_Registration_Line_2 
INTO ##temptable2 
FROM ##temptable 
WHERE NOT EXISTS 
(
SELECT ##PrefixedAccounts.Acct_Nbr 
FROM ##PrefixedAccounts 
WHERE ##PrefixedAccounts.Acct_Nbr = ##temptable.Acct_Nbr 
); 
WITH DATA AS 
(
SELECT 
RcdTypId,Acct_Nbr,Acct_Short_Nm,Acct_Holder_Typ_Cd,Acct_Holder_Role_Cd,Prefix_Suffix, 
NULL AS First_Nm, Middle_Nm, Last_Nm,Acct_Registration_Line_1,Acct_Registration_Line_2 
FROM ##PrefixedAccounts 
UNION ALL 
SELECT 
RcdTypId,Acct_Nbr,Acct_Short_Nm,Acct_Holder_Typ_Cd,Acct_Holder_Role_Cd,NULL AS Prefix_Suffix,First_Nm,Middle_Nm,Last_Nm, 
NULL AS Acct_Registration_Line_1,NULL AS Acct_Registration_Line_2 
FROM ##temptable2 
) 
SELECT * INTO ##ClientNames FROM DATA 
DROP TABLE ##temptable2 
DROP TABLE ##PrefixedAccounts 

-- SELECT * FROM ##ClientNames ORDER BY prefix_Suffix desc 
-- DROP TABLE ##ClientNames 

SELECT distinct 
cl.Prefix_Suffix,cl.First_Nm,cl.Last_Nm,cl.Acct_Registration_Line_1,cl.Acct_Registration_Line_2 
,at.secondlevel,at.TopLevel FROM ##ClientNames cl 
INNER JOIN ##AddeparTemplate at ON cl.Acct_nbr = at.owned 
WHERE 1 = 1 
AND (cl.Last_Nm IS NOT NULL OR cl.Acct_Registration_Line_1 IS NOT NULL) 
ORDER BY cl.prefix_suffix, at.secondlevel 
DROP TABLE ##ClientNames 
+1

는 –

+0

이 상당히 작동하지 select 문 –

답변

0

이게 원하는가요?

select t.* 
from (select t.*, 
      row_number() over (partition by coalesce(prefix_suffix, first_nm + ' ' + last_nm) 
           order by (case when first_nm is not null then 1 else 2 end) 
           ) as seqnum 
     from ##temptable t 
    ) t 
where seqnum = 1; 
+0

를 추가하여 현재 SELECT 문을 제공합니다. 그룹의성에 값이있는 경우. Prefix_Suffix가 NULL 인 행은 필요 없습니다. 나는 단지 Prefix_Suffix가 모든 성 (lastname) 값이 그룹 내에서 NULL임을 원한다. –