2016-12-09 2 views
1

저는 여기에서 내 문제와 같은 질문/대답을 연구했지만 발견 한 바가 없습니다.SQL - GROUP BY & HAVING COUNT 문제

SELECTING with multiple WHERE conditions on same column ---이 링크는 매우 가까이 있지만 내 문제에는 여전히 작동하지 않습니다.

문제 : 나는, 그것은 단지 EFTS 항목이 있는지 여부에 따라 만 RCC를 SEL_PROFILE_DETAIL_FK하여 고유의 출력을 개발해야

SEL_PRO_PMTMETHOD_PK SEL_PROFILE_DETAIL_FK PMT_TYPE PMT_STATUS 
43827     342997     EFT   G 
43828     342997     EFT   P 
43829     342997     RCC 
43826     342997     EFT 

43776     342922     EFT 
43777     342922     EFT   G 
43778     342922     EFT   P 

지불 방법 및 지불 상태를 수납하는 테이블 (빈 상태는 OK입니다) 한 항목 또는 EFT와 RCC 항목 모두.

난 단지 EFT 만 RCC

에 대한 쉬운 물건을 알아 냈하지만 난 FK 그룹화에서 EFT와 RCC 항목 BOTH가 있는지 알 수 있어야합니다. 지금까지

내 코드 :

SELECT pmt_type 
FROM sel_pro_pmtmethod 
WHERE sel_profile_detail_fk = '342997'  
    AND pmt_type IN ('EFT', 'RCC') 
GROUP BY pmt_type 
HAVING COUNT(distinct pmt_type) >= 1 

이 코드는 위의 두 세트의 데이터에 대한 pmt_type을 다시 반환합니다. EFT와 RCC 모두 또는 EFT 만 있다면 상관 없습니다.

내가 "= 2"가되도록 HAVING COUNT 절을 변경하지만 그건 아무 것도 반환하지 않습니다 때문에 로타리 지역 사회 봉사단의 수 = 1과 EFTS의 = 3

하지만 내가 필요로하는 것은 BY이 WHERE/GROUP입니다/그룹화에 EFT 및 RCC 항목이있는 경우 시나리오가 참입니다. 누락 된 것이 있으면 실패합니다.

+0

'COUNT를 갖는 그것은 당신이 실제로 둘 경우에만로 제한하지만, 둘 중 하나 또는 둘 모두가있는 경우 알고 싶어하지 않는 것처럼 소리와 당신이 conditional aggregation과 같이 그렇게 할 수 있습니다 'DISTINCT'는 각 값의 1 번 발생 만 계산하므로 한 번 'EFT'와 'RCC'를 한 번만 계산하므로 원하는 결과를 얻을 수 있습니다.오, 그리고'GROUP BY SEL_PROFILE_DETAIL_FK'은'pmt_type'이 아닙니다 – Matt

+0

HAVING COUNT = 2 일 때 클로저처럼 보입니다.이 부분은 간단한 쿼리로 변경할 수 있지만 SEL_PROFILE_DETAIL_FK와 PMT_TYPE의 두 열만 변경할 수 있습니다. SEL_PROFILE_DETAIL_FK 만 그룹화하고 where 절에 pmt_type IN ('EFT', 'RCC')을 넣습니다. 필요 없음. 하위 쿼리로 사용하고 SEL_PROFILE_DETAIL_FK를 사용하여 모든 쿼리에 연결/가입 – Girish

+0

전자 송금 (EFT) 및 RCC는 ** 결제 유형 **입니까? 두 가지 이상의 지불 유형이있을 수 있으며이 두 가지 유형에만 관심이있는 경우 두 가지 지불 유형이있을 수있는 경우 두 가지 모두 정답 인 HAVING 절을 변경할 수 있습니다. (예 : pmt_type = 'EFT', 'x'끝)> 0 그리고 count (pmt_type = 'RCC', 'x'끝> – mathguy

답변

2
SELECT SEL_PROFILE_DETAIL_FK 
FROM sel_pro_pmtmethod 
WHERE pmt_type IN ('EFT', 'RCC') 
GROUP BY SEL_PROFILE_DETAIL_FK 
HAVING COUNT(distinct pmt_type) = 2 

귀하의 그룹에 의해 잘못이었다. 그룹화를 pmt_type으로 지정하면 행당 하나의 유형 만 표시됩니다. 당신이 외래 키에 의해 그것을 원하기 때문에 당신은 그것을 그룹화 할 필요가 있습니다.

DISTINCT은 각 값이 1 회만 발생한다는 것을 의미합니다. 당신이 실제로 원하는 경우

는 그리고 당신은 윈도우 함수조건 집계 사용과 관련된 모든 레코드 : 원본의 모든 레코드를 얻을 수

SELECT * 
FROM 
    (
     SELECT 
      * 
      ,COUNT(CASE WHEN PMT_TYPE = 'EFT' THEN PMT_TYPE END) OVER (PARTITION BY SEL_PROFILE_DETAIL_FK) EftCount 
      ,COUNT(CASE WHEN PMT_TYPE = 'RCC' THEN PMT_TYPE END) OVER (PARTITION BY SEL_PROFILE_DETAIL_FK) RCCCount 
     FROM 
      sel_pro_pmtmethod 
     WHERE 
      PMT_TYPE IN ('EFT','RCC') 
    ) t 
WHERE 
    t.EftCount > 0 
    AND t.RCCCount > 0 

또는 다른 대안은 첫 번째 방법을 가지고하는 것입니다 그래서 같은 상관 서브 쿼리에서 EXISTS를 사용

SELECT * 
FROM 
    sel_pro_pmtmethod m1 
WHERE 
    EXISTS (SELECT 1 
      FROM sel_pro_pmtmethod m2 
      WHERE 
      m1.SEL_PROFILE_DETAIL_FK = m2.SEL_PROFILE_DETAIL_FK 
      m2.pmt_type IN ('EFT', 'RCC') 
      GROUP BY m2.SEL_PROFILE_DETAIL_FK 
      HAVING COUNT(distinct m2.pmt_type) = 2 

그리고 게시물이 부분을 해결하기 위해 "나는 개발해야 유일한 EFT 항목, RCC 항목 또는 BOTH EFT 및 RCC 항목이 있는지 여부에 따라 SEL_PROFILE_DETAIL_FK에 의해 고유 한 출력이 표시됩니다. (

SELECT 
    SEL_PROFILE_DETAIL_FK 
    ,CASE 
     WHEN EFTCount > 0 AND RCCCount > 0 THEN 'Both' 
     WHEN RCCCount > 0 THEN 'RCC' 
     ELSE 'EFT' 
    END as PmtTypesPresent 

FROM 
    (
    SELECT 
     SEL_PROFILE_DETAIL_FK 
     ,COUNT(CASE WHEN PMT_TYPE = 'EFT' THEN PMT_TYPE END) as EFTCount 
     ,COUNT(CASE WHEN PMT_TYPE = 'RCC' THEN PMT_TYPE END) as RCCCount 
    FROM sel_pro_pmtmethod 
    WHERE pmt_type IN ('EFT', 'RCC') 
    GROUP BY SEL_PROFILE_DETAIL_FK 
) t 
+0

매우 유용합니다. 고맙습니다! –

+0

@MarkLudlow 오신 것을 환영합니다. 당신이 대답을 얻은 경우, 다른 사람들이 당신의 보살핌을 받았다는 것을 알기 위해 사용했던 그 중 하나를 받아들이십시오. 평판 포인트가 주어집니다. 또한 올바른 대답/응답을 upvoting뿐만 아니라 좋은 예의입니다. 건배. – Matt

2

이 시도 :

SELECT SEL_PROFILE_DETAIL_FK 
FROM sel_pro_pmtmethod 
WHERE pmt_type IN ('EFT', 'RCC') 
GROUP BY SEL_PROFILE_DETAIL_FK 
HAVING MIN(pmt_type) <> MAX(pmt_type) 
+0

+1이 방법은 올바르게 그룹화되어 MAX와 MIN이 같은 유형이 아니기 때문에 작동합니다. – Matt