如何根据另一列的值获取列的不同计数

时间:2017-02-09 06:03:59

标签: sql oracle group-by

如何根据另一列的值获取列的不同计数?

我可以理解这可以通过创建另一个中间表来实现,但是我在数十亿行的表上运行此查询,所以如果我们可以在一个查询中获得结果而不是创建另一个分组会更好。

以下是测试的样本创建代码。

CREATE TABLE MYGROUP ( Category,PERSON,Flag ) AS
          SELECT 'Cat1','A','1' FROM DUAL
UNION ALL SELECT 'Cat1','A','0' FROM DUAL
UNION ALL SELECT 'Cat1','A','1' FROM DUAL
UNION ALL SELECT 'Cat1','B','1' FROM DUAL
UNION ALL SELECT 'Cat1','B','0' FROM DUAL
UNION ALL SELECT 'Cat2','A','0' FROM DUAL
UNION ALL SELECT 'Cat2','A','0' FROM DUAL
UNION ALL SELECT 'Cat2','A','0' FROM DUAL
UNION ALL SELECT 'Cat2','B','1' FROM DUAL
UNION ALL SELECT 'Cat2','B','1' FROM DUAL
UNION ALL SELECT 'Cat2','B','0' FROM DUAL
UNION ALL SELECT 'Cat3','X','0' FROM DUAL
UNION ALL SELECT 'Cat3','Y','0' FROM DUAL;

期望的输出:

Category    Count of Distinct Persons with Flag =1
Cat1        2
Cat2        1
Cat3        0

输出原因 A和B都有Flag = 1,因此第一行的计数为2 并且只有B带有Flag = 1,因此第二行中的计数为1 Cat3计数为0,因为没有Flag = 1

的行

2 个答案:

答案 0 :(得分:2)

使用COUNT(DISTINCT PERSON)

SELECT Category,
       COUNT(DISTINCT CASE WHEN Flag = 1 THEN PERSON END) AS distinct_count
FROM MYGROUP
GROUP BY Category

在这里演示:

SQLFiddle

答案 1 :(得分:1)

使用count(distinct decode(flag,1,person,null))

它将忽略标志不等于“1”并且工作速度更快的人

select  category ,count (distinct decode(flag,1,person,null)) countof from MYGROUP
group by category

或者您可以使用分析函数Over (partition by )子句

一般来说,分析函数的工作速度更快。以下是如何为此问题应用分析函数的示例:

select distinct  category ,count (distinct decode(flag,1,person,null)) over (partition by category) countof from MYGROUP

查看执行计划并为您更好地选择什么