2012-08-27 5 views
0

의 열 값의 조합을 받고 나는이는 TSQL

rowid deltaValue Applicable 
1  r   n/d 
1  w   n/d 
1  m   n/d 
2  r   n/d 
2  w   n/d 
2  m   n/d 
3  r   n/d 
3  w   n/r 
3  m   n/d 

같은 데이터베이스 구조 그래서 기본적으로 난 단지 'ROWID', 즉 rowid=3의 마지막 그룹을 선택 할 수 있습니다. 이것은 조합이

인 조합이 있기 때문에 조합을보고 그룹 (즉, rowid)을 가져 오는 tsql 쿼리가있는 유일한 그룹이기 때문입니다.

select * 
from table 
where 1=1 
and deltaValue in ('r','w','m') 
and (( 1=(case when [DeltaValue] = 'r' and [Applicable]='n/r' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/d' then 1 else 0 end) 
    ) OR 
    ( 1=(case when [DeltaValue] = 'r' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/r' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/d' then 1 else 0 end) 
    ) OR 
    ( 1=(case when [DeltaValue] = 'r' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'w' and [Applicable]='n/d' then 1 else 0 end) 
    and 1=(case when [DeltaValue] = 'm' and [Applicable]='n/r' then 1 else 0 end) 
    ) 
    ) 

출력 :

3  r   n/d 
3  w   n/r 
3  m   n/d 
+0

원하는 출력을 보여줄 수 있습니까? –

+0

출력을 추가했습니다 – masfenix

답변

1

이 시도 : 여기 는 내가 지금까지 무엇을 가지고

with temp as 
(
    SELECT t.rowid 
    FROM myTable t 
    GROUP BY t.rowid 
    HAVING COUNT(CASE WHEN Applicable= 'n/d' THEN 1 END) > 0 
     AND COUNT(CASE WHEN Applicable= 'n/r' THEN 1 END) > 0; 
) 
select * from MyTable as mt 
INNER JOIN temp as t 
ON mt.RowId = t.RowId 
+0

rowid = 'n/d'<---이 의미가 없습니다 – ClearLogic

+0

고마워, 의도 한대로 작동합니다. – masfenix

0

이 하나

SELECT  * 
FROM  Table1 
WHERE  rowid IN (SELECT rowid 
         FROM (SELECT * , DENSE_RANK() OVER (PARTITION BY rowid ORDER  BY Applicable) AS myRank FROM Table1 
          ) AS t 
         WHERE t.myRank > 1) 
0

을 시도해보십시오 수 다음 개발을 고려하다 NT @Abe Miessler's 제안에 : 당신이 볼 수 있듯이

WITH counted AS (
    SELECT 
    *, 
    [n/d count] = COUNT(CASE DeltaValue WHEN 'n/d' THEN 1 END) OVER (PARTITION BY rowid), 
    [n/r count] = COUNT(CASE DeltaValue WHEN 'n/r' THEN 1 END) OVER (PARTITION BY rowid) 
    FROM atable 
) 
SELECT 
    rowid, 
    DeltaValue, 
    Applicable 
FROM counted 
WHERE [n/d count] > 0 AND [n/r count] > 0 
; 

, 당신은이 COUNT() 집계 함수의 windowing 버전을 사용하여 가입 피할 수 있습니다. 그런데

, 혹시 두 개 이상의 서로 다른 DeltaValue, 당신은 약간 다른 접근 사용할 수있는 모든 그룹 반환하는 쿼리가 더 보편적 등해야 할 경우 :

WITH counted AS (
    SELECT 
    *, 
    MinDeltaValue = MIN(DeltaValue) OVER (PARTITION BY rowid), 
    MaxDeltaValue = MAX(DeltaValue) OVER (PARTITION BY rowid) 
    FROM atable 
) 
SELECT 
    rowid, 
    DeltaValue, 
    Applicable 
FROM counted 
WHERE MinDeltaValue <> MaxDeltaValue 
; 

위의 쿼리를 MAX()MIN()을 사용하여 그룹 당 최소 및 최대 값 (rowid)을 찾고 최소값이 최대 값과 다른 그룹을 반환합니다.