2015-02-03 2 views
0

누군가 나를 도와 줄 수 있습니까? 예 : 계정에 AV.Query = 'PN4', AV.Response = 'Y', AV.Query = 'FL1'및 AV.Response = 'Y'가있는 문제는SQL 사례 논리 문제

이어야합니다.
PStatus IStatus 
4   2 

그러나, 나는

PStatus IStatus 
4   5 
5   2 

를 얻고 그것은 반대 컬럼에있는 모든 시간을 "5"를 선택합니다.

SELECT distinct A.AcctNum, 
     CASE 
     WHEN O.Order = 'NEI2' THEN '1' 
     WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' 
     ELSE '5' 
     END AS [PStatus], 

    CASE 
     WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' 
     WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' 
      WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' 
     WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' 
    ELSE '5' 
    END AS [IStatus] 

FROM AData AS AD 

     INNER JOIN AVisit AS AV 
     ON AD.Visit = AV.Visit 
     AND AV.QueryID IN ('PNE1','PNE2','PN20','PN4','FL1','REF','FL2','FL6','NEU.G','HE.B','NOA') 

     LEFT JOIN Order AS O 
    ON AD.Visit = O.Visit 
     AND O.Order IN ('NEI2','DO2','FL25','VACHP'); 
+0

데이터없이 SQL 바이올린을 데이터를 분석하기가 매우 어렵습니까? – DevelopmentIsMyPassion

+0

sql 바이올린이란 무엇입니까? 고맙습니다. – Bulbul

+0

이 웹 사이트로 이동하여 테이블을 만들고 데이터를 삽입하십시오. 완료되면 우리에게 URL을 제공 http://www.sqlfiddle.com/ – DevelopmentIsMyPassion

답변

3

검색 결과가 정확한 것으로 보입니다.

은 그 가입의 행 이것은 CASE 마지막 WHEN 조건 일치

AV.Query = 'PN4'AV.Response = 'Y'를 갖는 제 고려 식 [PStatus]에 대한 의 CASE 식의 WHEN 조건과 일치하지 않습니다. 결과 :

4 5 

은 행이

AV.Query = 'FL1'을 갖는 AV.Response이 = 'Y'가

이 어떤 WHEN 조건에 일치하지 않는 지금 가입 고려 에 대한 CASE 표현식이지만 [IStatus]에 대한 CASE 표현의 두 번째 WHEN 조건과 일치합니다. 결과 :

5 2 

내가 당신에게 당신이 제시 특정 데이터에 지정된 결과를 쿼리에 변화를 줄 수 있지만, 많은 대안이 있기 때문에 내가 그렇게하지 않고, 당신이 우리를 부여하지 않은 어떤 정보가 다른 데이터에 대한 질문에 올바르게 응답 하는지를 결정하는 정보.

는 UPDATE :

하나에 여러 결과 행을 결합하려면, 당신은 집계 쿼리를 필요로한다. 이러한 쿼리를 구현하는 한 가지 방법은 COUNT() 이외의 집계 함수가 NULL의를 무시하기 때문에 작동

SELECT 
    AcctNum, 
    MIN(
    CASE 
     WHEN O.Order = 'NEI2' THEN '1' 
     WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' 
     ELSE NULL 
    END 
) AS [Pstatus], 
    MIN(
    CASE 
     WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' 
     WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' 
     WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' 
     ELSE NULL 
    END 
) AS [IStatus] 
FROM 
    AData AS AD 
    INNER JOIN AVisit AS AV 
    ON AD.Visit = AV.Visit 
     AND AV.QueryID IN ('PNE1','PNE2','PN20','PN4','FL1','REF','FL2','FL6','NEU.G','HE.B','NOA') 

    LEFT JOIN Order AS O 
    ON AD.Visit = O.Visit 
     AND O.Order IN ('NEI2','DO2','FL25','VACHP'); 
GROUP BY AcctNum 

것이다 당신의 주어진 데이터 값 4, 2를 갖는 단일 행을 제공합니다. 그러나 서로 다른 데이터 패턴, 특히 동일한 계정에 2 개 이상인 패턴이있는 경우 원하는 답변을 제공하지 못할 가능성이 큽니다.

+0

정확히 John, 어떻게 해결할 수 있습니까? 모든 대안은 내가 올바른 결과를 얻고 "5"가 항상 추가되지 않는 이상 작동합니다. – Bulbul

+0

모든 쿼리에는 응답 "Y"또는 "N"이 있습니다. "Y"응답이있는 쿼리 만 필요합니다. 이 예제 계정에는 AV.Query = 'PN4'및 AV.Query = 'FL1'("Y"응답)이 있습니다. 따라서 결과는 4 2가되어야합니다. – Bulbul

+0

두 개의 결과 열을 계산하고 있으며, 레이블은 'PStatus'와 'IStatus'로 지정되어 있습니다. 대신에 하나만 원한다고 말하는거야? –

1

결과가 정확합니다.

귀하의 값은 다음과 같습니다

첫 번째 행 - AV.Query='PN4', AV.Response = 'Y' 둘째 행 - AV.Query='FL1', AV.Response='Y'

첫 번째 CASE PStatus : 예상대로 결과는 4입니다.

다음 사례, Istatus. 아마도 SQL은 여전히 ​​동일한 값 (첫 번째 행)을 처리 할 것이므로 오해가있을 것입니다. 이 CASE은 첫 번째 행의 값 AV.Query='PN4', AV.Response = 'Y'을 확인합니다. 두 번째 값 (AV.Query='FL1' and AV.Response='Y')과 반대가 아닙니다.

'PN4' and 'FL1'은 같은 줄에 같은 열에있을 수 없습니다! 하나의 열은 두 개가 아닌 하나의 값만 가질 수 있습니다. 이 두 번째 경우 SQL은 다른 (두 번째) 데이터 행을 가져 오기 시작할 것이라고 예상 할 수 있습니다. 그러나 그렇지 않습니다.

두 번째 경우 결과가 값 PN4을위한 컨디셔닝되지 않은, 그래서 ELSE = 5


OK 편집으로 끝날되어 수행을 다음과 같이이 무력을하지만, 작동하기 때문에 경우에 정확 ;-)

SELECT A.AcctNum, 
    COALESCE(MAX(CASE 
     WHEN O.Order = 'NEI2' THEN '1' 
     WHEN AV.Query IN ('PNE1','PNE2') AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'PN20' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query = 'PN4' AND AV.Response = 'Y' THEN '4' 
     ELSE NULL 
     END),5) AS [PStatus], 

    COALESCE(MAX(CASE 
     WHEN O.Order IN ('DO2','FL25','VACHP') THEN '1' 
     WHEN AV.Query = 'FL1' AND AV.Response = 'Y' THEN '2' 
     WHEN AV.Query = 'REF' AND AV.Response = 'Y' THEN '3' 
     WHEN AV.Query IN ('FL2','FL6','NEU.G','HE.B') AND AV.Response = 'Y' THEN '4' 
     WHEN AV.Query = 'NOA' AND AV.Response = 'Y' THEN '6' 
    ELSE NULL 
    END),5) AS [IStatus] 
+0

예, 이해합니다. 하지만 어떻게 해결할 수 있습니까? 나에게 입력 할 수있는 제안이나 코드가 있습니까? 고맙습니다. – Bulbul

+0

한 계정의 경우 "FL1", "DO2"및 "NEI2"를 사용하므로 1,1 및 5,4를 기대했지만 "MAX"(사용자 쿼리)를 사용하여 1,4 개를 제공했습니다. "MIN"(위의 John의 쿼리)을 사용하면 1,1이됩니다. 옳은 대답은 1,4, 5,1 또는 1,1과 5,4가되어야합니다. – Bulbul

+0

흠, 쿼리 아래 사용, 우리가 특정 계정에 대한 모든 원시 데이터를 제공 는'AD AS -DATA SELECT * FROM INNER AD.Visit = AV.Visit 및 AV.QueryID IN ('PNE1 ON AV AS AVisit 가입 ','PNE2 ','PN20 ','PN4 ','FL1 ','REF ','FL2 ','FL6 ','NEU.G ','HE.B ','NOA ') LEFT JOIN 주문 AS O ON AD.Visit = O.Visit 및 O.Order IN ('NEI2', 'DO2', 'FL25', 'VACHP') ACCTNUM = ''* insert_the_accunt_which_cusing_trouble *'' –