Sql 如何基于同一查询中的第二个不同列对值进行计数?
我读过其他一些类似的文章,但似乎找不到适合我情况的解决方案 下面是我开始的查询的简化版本:Sql 如何基于同一查询中的第二个不同列对值进行计数?,sql,ssms,Sql,Ssms,我读过其他一些类似的文章,但似乎找不到适合我情况的解决方案 下面是我开始的查询的简化版本: 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))
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”值的行进行计数,而不仅仅是对具有不同val3的行进行计数,这导致它的计数比应该的要大得多
从本质上讲,我试图实现的大致就是这个逻辑-
count(当val3不同,val4='Y'然后是1 else null end时的情况)
但就我所知,我没有找到一个好方法来检查一个列在一个case语句中是否是不同的,所以我在这里被难住了。我也愿意看到一些完全不同的解决方案
编辑:另一个注意事项是,val4对于每个val3总是相同的。因此,如果有多行val3具有不同的val4值,则不应存在冲突。如果我理解正确,您需要具有
'Y'
的不同val3
s。只需使用条件聚合:
count(distinct case when val4 = 'Y' then val3 end)
对不起,如果我的描述不好。遗憾的是,这并不能完全解决这个问题。基本上tbl1返回许多重复的值——比如说,5行中的每一行都有相同的值3。我最初的查询通过只计算不同的val3来解决这个问题。counting val4的问题是它要计算所有5行,但我希望它只对不同的val3值(以及当它等于“Y”时)计算val4。我无法基于val4执行distinct,因为它只有2个潜在值,Y或N。我的另一个想法可能是在达到计数之前过滤掉tbl1中的重复行。这不是
count(distinct CASE…END)
?@stickybit。非常感谢。