我在这里研究并找到了像我的问题一样的问题/答案,但我找不到完全合适的问题。
SELECTING with multiple WHERE conditions on same column --这个链接非常接近,但对我的问题仍然不起作用。
问题:我有一张表,里面有付款方式和支付状态(空白状态可以)。
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分组。
到目前为止我的代码是:
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方案是真实的。如果一个人失踪了,那他就失败了。
发布于 2016-12-09 17:18:11
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次出现。
如果你真的想要所有相关的记录,你可以使用窗口函数和条件聚合
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是否只有EFT条目,只有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发布于 2016-12-09 17:08:16
试试这个:
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)https://stackoverflow.com/questions/41065340
复制相似问题