我已经研究并找到了像我的问题一样的问题/答案,但是我什么都不适合。
在同一列上的多个条件下选择----此链接非常接近,但仍然对我的问题不起作用。
问题:我有一个可以容纳付款方式和付款状态的表(空白状态还可以)
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)