2013-04-26 2 views
3

다음 코드를 가지고 있으며이를 그룹에 포함시키지 않는 방법을 알아내는 데 어려움이 있습니다. 인수의 일부는 순전히 사건을위한 것이고 그것이 전부입니다. 나는 그들을 그룹에 포함시킬 수 없다. 나는 TransactionTyp에 의해서만 카운트를 얻을 필요가 있기 때문에 다른 어떤 그룹으로도 그룹핑하지는 못한다. 그러나 나는이 에러를 계속 발생시킨다 : 집계 함수 나 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에는 유효하지 않다.사례없이 그룹에서 필드를 사용하여

아마도 CASE를 사용하는 것이 잘못된 방법 일 수 있습니까? 그러나 다른 필드를 기반으로 한 일부 값을 대체해야합니다.

이것은 MS SQL에도 있습니다.

SELECT Count(*), 
    CASE 
     WHEN a.TransactionTyp IS NOT NULL THEN a.TransactionTyp 
     WHEN a.ClaimStatus = 'Resolved-Deflected' THEN 'Deflected' 
     WHEN a.ClaimStatus = 'Resolved-NoAction' THEN 'Deflected' 
     WHEN a.ClaimStatus = 'Open' AND b.AssignOperator = 'PendClaim.NF_POS_Pinless' THEN 'Affiliate' 
    END As TransactionTyp 
FROM Table1 a 
LEFT JOIN Table2 b 
    ON a.ClaimNbr = b.ClaimDisputeNbr AND b.CreateDte = Convert(varchar,GetDate(), 101) 
WHERE a.ClaimEntryDte = Convert(varchar,GetDate(),101)  
AND a.ClaimTypCd IN ('DEBS', 'DEBSI', 'DBCIN', 'DBCUS') 
GROUP BY TransactionTyp 
+0

이것은 MS SQL 서버? –

+0

네, 사과드립니다. 예, 그렇습니다. – Dulanic

답변

2

하나의 문제는 당신이 group by 절에 별칭을 참조 할 수 없습니다 수 있습니다. group bycase 정의를 반복하려고 :

GROUP BY 
    CASE 
     WHEN a.TransactionTyp IS NOT NULL THEN a.TransactionTyp 
     WHEN a.ClaimStatus = 'Resolved-Deflected' THEN 'Deflected' 
     WHEN a.ClaimStatus = 'Resolved-NoAction' THEN 'Deflected' 
     WHEN a.ClaimStatus = 'Open' AND b.AssignOperator = 'PendClaim.NF_POS_Pinless' THEN 'Affiliate' 
    END As TransactionTyp 

다른 방법으로는, 별명을 정의하는 하위 쿼리를 사용

select TransactionTyp 
,  count(*) 
from (
     SELECT CASE 
       WHEN a.TransactionTyp IS NOT NULL THEN a.TransactionTyp 
       WHEN a.ClaimStatus = 'Resolved-Deflected' THEN 'Deflected' 
       WHEN a.ClaimStatus = 'Resolved-NoAction' THEN 'Deflected' 
       WHEN a.ClaimStatus = 'Open' AND b.AssignOperator = 'PendClaim.NF_POS_Pinless' THEN 'Affiliate' 
       END As TransactionTyp 
     FROM Table1 a 
     LEFT JOIN 
       Table2 b 
     ON  a.ClaimNbr = b.ClaimDisputeNbr 
       AND b.CreateDte = Convert(varchar,GetDate(), 101) 
     WHERE a.ClaimEntryDte = Convert(varchar,GetDate(),101)  
       AND a.ClaimTypCd IN ('DEBS', 'DEBSI', 'DBCIN', 'DBCUS') 
     ) 
GROUP BY 
     TransactionTyp 
+0

고마워요! 이제 이해가된다. 도움을 감사하십시오. 아직도 다소 새로운 SQL :) – Dulanic

0

CASEGroup BY 문에 있어야 아닌 ID. 이처럼

:

GROUP BY CASE 
    WHEN a.TransactionTyp IS NOT NULL THEN a.TransactionTyp 
    WHEN a.ClaimStatus = 'Resolved-Deflected' THEN 'Deflected' 
    WHEN a.ClaimStatus = 'Resolved-NoAction' THEN 'Deflected' 
    WHEN a.ClaimStatus = 'Open' AND b.AssignOperator = 'PendClaim.NF_POS_Pinless' THEN 'Affiliate' 
END 
0

쿼리에서 반환 할 것을 지정에 도착하면, 결과가 이미 그룹화, 그래서 당신은 반환 할 것을이 group by에 지정해야합니다되었다.

이에 대한 해결책은 값을 계산하는 하위 쿼리를 만드는 것입니다 다음 그룹화 할 수 있습니다 부질의 결과 :

SELECT Count(*), TransactionTyp 
FROM (
    SELECT 
    CASE 
     WHEN a.TransactionTyp IS NOT NULL THEN a.TransactionTyp 
     WHEN a.ClaimStatus = 'Resolved-Deflected' THEN 'Deflected' 
     WHEN a.ClaimStatus = 'Resolved-NoAction' THEN 'Deflected' 
     WHEN a.ClaimStatus = 'Open' AND b.AssignOperator = 'PendClaim.NF_POS_Pinless' THEN 'Affiliate' 
    END As TransactionTyp 
    FROM Table1 a 
    LEFT JOIN Table2 b 
    ON a.ClaimNbr = b.ClaimDisputeNbr AND b.CreateDte = Convert(varchar,GetDate(), 101) 
    WHERE a.ClaimEntryDte = Convert(varchar,GetDate(),101)  
    AND a.ClaimTypCd IN ('DEBS', 'DEBSI', 'DBCIN', 'DBCUS') 
) as x 
GROUP BY TransactionTyp 
관련 문제