SQL如何在另一列不同时计算一列

时间:2017-09-26 14:11:25

标签: sql oracle count duplicates

我有一张看起来像这样的表:

fin_aid_status | student_number
---------------|---------------
YES            | 111222
YES            | 111222
               | 111333
YES            | 111444

我想计算重复student_number的fin_aid_status但不计算双重计数的行数。所以我希望从这个表中得到的结果是2.不是3因为111222在表中两次。表中还有许多其他列,但只是在表中查找唯一值是行不通的。

编辑:这是 Oracle

例如我已经使用了这样的代码:

select count(*), count(distinct student_number) from table

因此,对于第三栏,我想用唯一的学生数来计算经济援助的数字。

所以我的预期输出是:

count(*) | count(distinct student_number) | count_fin_aid
4        | 3                              | 2

3 个答案:

答案 0 :(得分:1)

当fin_aid_status不为null时,使用case语句来计算student_number;然后计算不同的值。

SELECT count(Distinct case when fin_aid_status is not null 
                           then student_number end)  as Distinct_Student
FROM tbl;

使用样本数据的结果:2

鉴于Oracle:

With cte (fin_aid_status, student_number) as (
SELECT 'YES'            , 111222 from dual union all
SELECT 'YES'            , 111222 from dual union all
SELECT ''               , 111333 from dual union all
SELECT 'YES'            , 111444 from dual )
SELECT count(Distinct case when fin_aid_status is not null 
                           then student_number end) as DistinctStudentCnt 
FROM  cte;

答案 1 :(得分:0)

如果你使用的是MySQL,你可以写下如下所示的内容,如果你想要的只是计数

SELECT count(DISTINCT student_number) FROM your_table WHERE fin_aid_status = 'YES';

答案 2 :(得分:0)

我假设在这里,添加一些预期的结果,但是:

SELECT fin_aid_status,
       COUNT(DISTINCT student_number)
FROM tablename
GROUP BY fin_aid_status;

将为fin_aid_status列中每个值的student_number列提供不同值的计数