SQL - GROUP BY & HAVE COUNT 问题



我已经研究并找到了像我的问题一样的问题/答案,但是我什么都不适合。

在同一列上的多个条件下选择----此链接非常接近,但仍然对我的问题不起作用。

问题:我有一个可以容纳付款方式和付款状态的表(空白状态还可以)

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

我需要根据SEL_PROFILE_DETAIL_FK开发唯一的输出,具体取决于它是否只有EFTS条目,仅RCC条目,还是EFT和RCC条目。

我只为EFT找到了简单的东西,只有RCC

,但我需要能够判断FK分组中是否同时有EFT和RCC条目。

到目前为止我的代码:

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",但这一无所获,因为RCC的计数= 1和efts = 3。

但是,我需要的是,在分组中有EFT和RCC条目是否为the/group/ables by/group。如果缺少一个,则失败。

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进行分组将意味着每行只显示1类。因为您需要外键,所以您需要对此进行分组。

DISTINCT将意味着它将仅计算每个值的出现。

,如果您实际想要所有相关的记录

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

并讨论您的帖子的这一部分"我需要根据SEL_PROFILE_DETAIL_FK开发唯一的输出,具体取决于它是否只有EFTS条目,仅RCC条目,还是EFT和RCC条目。"这听起来好像您实际上不想只限制仅当它们既有的时候都限制,但知道一个或另一个或两个都在场,您可以使用conditional aggregation这样的做法:

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

尝试以下:

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)

最新更新