如何根据同一查询中的第二个不同列对值进行计数?

How do I do a count a value based on a second distinct column in the same query?

我已经阅读了其他一些类似的主题,但似乎找不到适合我的情况的解决方案。

这是我开始使用的查询的简化版本:

select 
   val1, 
   val2, 
   count(distinct(val3)) 
from
(
   [select with joins that produce some duplicate values]
) as tbl1
group by val1, val2

这有效地为 val1 和 val2 的任意组合提供了不同的行数。

我现在要做的是添加另一个计数,它计算一个单独的值,就像这样 -

select 
   val1, 
   val2, 
   count(distinct(val3)),
   count(case when val4 = 'Y' then 1 else null end) 
from
(
   [select with joins that produce some duplicate values]
) as tbl1
group by val1, val2

我在上述逻辑中遇到的问题是 val4 的计数正在计算具有 'Y' 值的 ALL 行,而不仅仅是具有不同 val3 的行,这导致它的计数比应有的大得多。

基本上我要实现的大致是这个逻辑-

count(case when val3 IS DISTINCT and val4 = 'Y' then 1 else null end)

但据我所知,我没有找到检查 case 语句中的列是否不同的好方法,所以我在这里感到很困惑。我也愿意看到一些完全不同的解决方案来解决这个问题。

编辑:另一个注意事项,val4 对于每个 val3 总是相同的。因此,如果有多行 val3 具有不同的 val4 值,则应该不会发生冲突。

如果我没理解错的话,您需要具有 'Y' 的不同 val3。只使用条件聚合:

count(distinct case when val4 = 'Y' then val3 end)