如果组中有值,如何编写SQL来计算group by之后的列中出现值的总数,同时将count作为1?
我有一个数据结构如下如果组中有值,如何编写SQL来计算group by之后的列中出现值的总数,同时将count作为1?,sql,pandas,Sql,Pandas,我有一个数据结构如下 ColumnA ColumnB ColumnC ------------------------- 1 1 Test 1 1 FAIL 1 1 FAIL 1 2 FAIL 1 2 FAIL 1 2 FAIL 2 1 TEST 2 1
ColumnA ColumnB ColumnC
-------------------------
1 1 Test
1 1 FAIL
1 1 FAIL
1 2 FAIL
1 2 FAIL
1 2 FAIL
2 1 TEST
2 1 FAIL
正如标题所示,在按ColumnA
和ColumnB
分组后,我想计算ColumnC
中“失败”的发生率,并且在计算发生率时,我只想计算组中的一个“失败”
例如,如果我对上述示例数据进行计数,结果将是:
ColumnA ColumnB count
---------------------------
1 1 1 (not 2)
1 2 1 (not 3)
2 1 1
到目前为止,我所做的SQL:
SELECT
SUM((CASE ColumnC WHEN 'FAIL' THEN 1 WHEN 'TEST' THEN 0 WHEN 'Test' THEN 0 END))
FROM
table
GROUP BY
ColumnA, ColumnB
上面的查询统计组中的每一个“失败”(上面的示例在列A
中给出了4:1),但我只想统计组中的一次。我应该如何处理这个问题
在pandas
中,我可以通过使用cumcount
向其添加序列来更改值,并通过添加序列号来更改值,然后在分组后只计算'FAIL1'
可以在SQL中执行吗?这回答了问题的原始版本
我想您需要count(distinct)
:
或者更简洁地说:
select columnA, count(distinct columnB)
from t
where columnC = 'Fail'
group by columnA;
非常感谢。我可以用这个来得到我在问题中发布的结果。后来我意识到我实际上也希望视图中有columnB。因此,当我在SELECT中包含ColumnB时,我必须将它包含在GROUPBY子句中,因此它计数为1或0,因为只有1个不同的行或没有。我也更新了问题,以便正确地思考我想要什么。@JeevaBharathi。这回答了你在这里提出的问题。如果你有一个不同的(或更精炼的问题)而不是作为一个新问题提问。修改问题使答案无效是不礼貌的,明白了吗。道歉
select columnA, count(distinct columnB)
from t
where columnC = 'Fail'
group by columnA;
select distinct columnA,count(ColumnC)
from t
where columnC = 'Fail'
group by columnA,columnB
order by columnA;