首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL - GROUP &有计数问题

SQL - GROUP &有计数问题
EN

Stack Overflow用户
提问于 2016-12-09 16:58:35
回答 2查看 1.9K关注 0票数 0

我在这里研究并找到了像我的问题一样的问题/答案,但我找不到完全合适的问题。

SELECTING with multiple WHERE conditions on same column --这个链接非常接近,但对我的问题仍然不起作用。

问题:我有一张表,里面有付款方式和支付状态(空白状态可以)。

代码语言:javascript
复制
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取决于它是只有EFT条目,只有RCC条目,或两者的EFT和RCC条目。

我想出了只适用于EFT和RCC的简单方法

但我需要能够判断是否有EFT和RCC两个条目在FK分组。

到目前为止我的代码是:

代码语言:javascript
复制
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。

我已经将HAVING子句更改为"= 2“,但没有返回任何内容,因为RCC=1和EFT= 3。

但是,我需要的是,如果分组中有EFT和RCC条目,那么其中/ GROUP BY / what方案是真实的。如果一个人失踪了,那他就失败了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-09 17:18:11

代码语言:javascript
复制
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将意味着它将只计算每个值的1次出现。

如果你真的想要所有相关的记录,你可以使用窗口函数和条件聚合

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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是否只有EFT条目,只有RCC条目,或EFT和RCC条目。”这让你听起来好像不想只局限于两者都存在的时候,而是知道其中一个或另一个都存在,你可以用conditional aggregation这样做:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-12-09 17:08:16

试试这个:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41065340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档