2010-12-30 4 views
0

EDIT : 끝 부분에 샘플 I/O가 있습니다.그룹화 된 서브 세트에 존재하거나 존재하지 않는 SELECT를 사용하여 존재 여부를 테스트하십시오.

특정 조건이 있거나 다른 조건이없는 경우 +1을 계산해야하는 데이터가 있습니다. 나는 임시 테이블에 다음과 같은 단순화 된 샘플 XML을 분쇄기과 유효성을 확인 SQL 서버 2008

을 사용하고 있습니다 :

<product type="1"> 
    <param type="1"> 
     <item mode="0" weight="1" /> 
    </param> 
    <param type="2"> 
     <item mode="1" weight="1" /> 
     <item mode="0" weight="0.1" /> 
    </param> 
    <param type="3"> 
     <item mode="1" weight="0.75" /> 
     <item mode="1" weight="0.25" /> 
    </param> 
    </product> 

우려의 검증은 다음과 같은 규칙입니다 :

들어 각 제품 유형은 각 매개 변수 유형에 대해 모드는 0 & (1 || 2) 일 수 있습니다. 다른 단어에는 0 (s)가있을 수 있지만 은 1 또는 2가 필요하고 은 1 또는 2 일 수 있습니다. 은 0이 아니며 1은 및 2가 될 수 없습니다.

내가 알아 내지 못했던 부분은 0 만 있는지 감지하는 방법입니다. 이것은 "문제가 없다"는 것처럼 보입니다.

(이 부분에 대한) 검증 코드 : 어떤 모드 1 초는 & 2 초를 혼합하는 경우

WITH t1 AS (
    SELECT  SUM(t.ParamWeight) AS S, COUNT(1) AS C, 
       t.ProductTypeID, t.ParamTypeID, t.Mode 
    FROM  @t AS t 
    GROUP BY t.ProductTypeID, t.ParamTypeID, t.Mode 
), 
    ... 
    UNION ALL   
    SELECT  TOP (1) 1 -- only mode 0 & (1 || 2) is allowed 
    FROM  t1 
    WHERE  t1.Mode IN (1, 2) 
    GROUP BY t1.ProductTypeID, t1.ParamTypeID 
    HAVING  COUNT(1) > 1 
    UNION ALL 
    ... 
) 
SELECT  @C = COUNT(1) 
FROM  t2 

이가 표시되지만 그룹 만 나는 간단한이 있는지 해요 0이 포함되지 않은 경우 솔루션,하지만 지금은 나를 피하고있어.

편집 : 나는 완벽하게 작동하는 "속임수"생각

.

SELECT  TOP (1) 1 -- only mode 0 & (null || 1 || 2) is allowed 
FROM  t1 
GROUP BY  t1.ProductTypeID, t1.ParamTypeID 
HAVING  SUM(t1.Mode) = 0 

그러나, 나는 여전히 부정하지 않고이 작업을 수행하는 방법을 알고 싶습니다 : 나는 위의에 다음을 추가했다. 난 당신이 다음 단지를 쿼리에 응답하는이 3 열을 사용 할 수 있다고 생각

SELECT ProductTypeID,ParamTypeID,MIN(Mode) as Has0,MAX(Mode) as M1or2,MAX(CASE WHEN Mode=1 THEN 1 ELSE 0 END) as M1 
from @t 
group by ProductTypeID,ParamTypeID 

:

SAMPLE은

Zero One Two Result 
1  0 0 False 
0  1 1 False 
1  1 1 False 
0  1 0 True 
0  0 1 True 
1  1 0 True 
1  0 1 True 

답변

2

글쎄, 당신은 다음과 같은 쿼리를 작성할 수 있습니다. Has0 = 0이면 모드 0 값이 있으므로 M1or2이 0보다 커야합니다 (올바르게 이해할 경우).

또한 M1or2 = 2 인 경우 M1을 0 (모드 2 행을 찾으면 모드 1 행을 찾을 수 없음)을 원한다고 확인할 수 있습니다.

나는 귀하의 설명을 올바르게 읽은 것 같습니다. 그렇지 않은 경우 "허용됨"및 "허용되지 않는"조합의 샘플을 추가하면 도움이 될 수 있습니다.


SELECT ProductTypeID,ParamTypeID,CASE 
    WHEN M1OrM2 = 2 And M1 = 1 THEN 0 /* Have both mode 2 and mode 1. Can ignore whether it has any Mode 0 */ 
    WHEN Has0 = 0 AND M1OrM2 = 0 THEN 0 /* Has a mode 0 and no M1 or M2 */ 
    ELSE 1 END /* All other combinations are allowed */ 
FROM (
SELECT ProductTypeID,ParamTypeID,MIN(Mode) as Has0,MAX(Mode) as M1or2,MAX(CASE WHEN Mode=1 THEN 1 ELSE 0 END) as M1 
from @t 
group by ProductTypeID,ParamTypeID 
) t 
+0

감사합니다 데미안. 만약 당신의 SQL을 올바르게 읽고 있다면, 그것은 저 모드가 1이면 Has0이 1이 될 수있는 것처럼 보입니다. 예 ... 테스트했습니다.내가 제안한대로 샘플을 게시 할 것입니다. – IamIC

+1

@IanC - 샘플 "거짓"행에 대해 0을 반환하는 열과 그렇지 않으면 1 인 열을 갖는 새 쿼리를 추가했습니다. 그게 충분한가요? –

+0

화려한! 정말 고마워!! – IamIC

관련 문제