Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于同一查询中的第二个不同列对值进行计数?_Sql_Ssms - Fatal编程技术网

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。非常感谢。