2013-11-15 3 views
0

2 열에 NULLS가없는 행만 표시하도록 필터링하는 데 어려움을 겪고 있습니다.2 열에서 NOT NULLS가있는 행을 필터링하는 방법

  • 는 난 단지 클라이언트에 대한 결과 (행) have a value in both Disability 1 and Disability 2를 원한다.

  • have a value in Disability 1 and NULL in Disability 2 or a NULL in Disability 1 and value in Disability 2의 클라이언트 (행)를 표시하지 않습니다.

내 열

장애 열 ClientName, ClientNumber, ClientAge, ClientGender, Disability1, Disability2가 CASE를 사용하여 별칭이다.

문제는 내가 발견했습니다

  • 어려운 필터링하는 경우 또는 갖는 조항,했다있는 별칭을 참조 할 수 없습니다.

  • 두 개의 조건에 대해 D.DiagnosisName을 참조하는 Having 절은 결과가 없음을 의미합니다.

모든 포인터가 좋을 것입니다.

건배

내 코드

:

SELECT 
    C.ClientName, 
    C.ClientNumber, 
    C.ClientAge, 
    C.ClientGender, 
    CASE 
     WHEN D.DiagnosisName = 'Depression' 
       OR D.DiagnosisName = 'Anxiety' 
       OR D.DiagnosisName = 'Drug and Alcohol' 
       OR D.DiagnosisName = 'Bipolar Disorder' 
       OR D.DiagnosisName = 'Delusional' 
       OR D.DiagnosisName = 'Eating Disorder' 
       OR D.DiagnosisName = 'Obsessive Compulsive Disorder' 
       OR D.DiagnosisName = 'Personality Disorder' 
       OR D.DiagnosisName = 'Post Traumatic Stress Disorder' 
       OR D.DiagnosisName = 'Post-Natal' 
       OR D.DiagnosisName = 'Schizo-affective disorder' 
       OR D.DiagnosisName = 'Schizophrenia' 
       OR D.DiagnosisName = 'Other Psychiatric/Psychological Disorder' 
       OR D.DiagnosisName = 'BPD' 
       OR D.DiagnosisName = 'Psychiatric (other)' 
      THEN D.DiagnosisName 
    END AS [Disability1], 
    CASE 
     WHEN D.DiagnosisName = 'Autism' 
       OR D.DiagnosisName = 'Intellectual' 
       OR D.DiagnosisName = 'Specific Learning/ADD' 
       OR D.DiagnosisName = 'Acquired Brain Injury/Head Injury' 
       OR D.DiagnosisName = ' Acquired Brain Injury-Head Injury' 
       OR D.DiagnosisName = 'Neurological' 
     THEN D.DiagnosisName 
    END AS [Disability2] 

FROM 
    dbo.FACTClientDiagnosis R 
    RIGHT OUTER JOIN DimClient C ON R.DimClientID = C.DimClientID 
    LEFT OUTER JOIN DimDiagnosisType D ON R.DimDiagnosisTypeID = D.DimDiagnosisTypeID 

WHERE 
    ClientStatus = 'Active'  
    AND ClientType = 'Client' 
    AND D.DiagnosisName NOT LIKE 'NULL' 

GROUP BY 
    C.ClientName, 
    C.ClientNumber, 
    C.ClientAge, 
    C.ClientGender, 
    D.DiagnosisName 

HAVING 
    (
     D.DiagnosisName = 'Depression' 
     OR D.DiagnosisName = 'Anxiety' 
     OR D.DiagnosisName = 'Drug and Alcohol' 
     OR D.DiagnosisName = 'Bipolar Disorder' 
     OR D.DiagnosisName = 'Delusional' 
     OR D.DiagnosisName = 'Eating Disorder' 
     OR D.DiagnosisName = 'Obsessive Compulsive Disorder' 
     OR D.DiagnosisName = 'Personality Disorder' 
     OR D.DiagnosisName = 'Post Traumatic Stress Disorder' 
     OR D.DiagnosisName = 'Post-Natal' 
     OR D.DiagnosisName = 'Schizo-affective disorder' 
     OR D.DiagnosisName = 'Schizophrenia' 
     OR D.DiagnosisName = 'Other Psychiatric/Psychological Disorder' 
     OR D.DiagnosisName = 'BPD' 
     OR D.DiagnosisName = 'Psychiatric (other)' 
    ) 
    AND 
    (
     D.DiagnosisName = 'Autism' 
     OR D.DiagnosisName = 'Intellectual' 
     OR D.DiagnosisName = 'Specific Learning/ADD' 
     OR D.DiagnosisName = 'Acquired Brain Injury/Head Injury' 
     OR D.DiagnosisName = ' Acquired Brain Injury-Head Injury' 
     OR D.DiagnosisName = 'Neurological' 
    ) 

ORDER BY 
    C.ClientName 
+0

그냥 관찰에 널 (null)에 대한

  • 확인 당신은 IN 문을 여러 OR 절을 대체 할 수 있습니다. –

  • 답변

    1

    당신은 다음과 같이 다른 SELECT .. FROM에 포장하여 파생/별칭 열을 필터링 할 수 있습니다. 또한이 경우 HAVING이 필요한 이유를 알 수 없습니다. 집계 필터가 없으므로 필터는 WHERE으로 이동할 수 있습니다.

    SELECT ..., x.Disability1, x.Disability2, ... 
    FROM 
    (
        SELECT ... AS Disability1, 
          ... AS Disability2 
        FROM ... 
        WHERE ... 
        GROUP BY ... 
    ) AS x 
    WHERE x.Disability1 IS NOT NULL AND x.Disability2 IS NOT NULL; 
    

    다른 어떤 잠재적 인 문제

    • 당신은 당신은 필터 (x in (a,b,c))... AND x IN (d,e,f)IN ('Intellectual', 'Autism', ...)
    • 으로 반복 OR의를 대체 할 수 - 중복이없는 한, 레코드가 반환됩니다. IS NULLIS NOT NULL하지 D.DiagnosisName NOT LIKE 'NULL'
    관련 문제