Sql 在计数之后选择不同的计数?
我将直接切入主题:我有一个选择,我正在写一个相当长的where子句,我想做的是计算百分比 所以我需要的是所有结果的计数,然后是每个不同的计数Sql 在计数之后选择不同的计数?,sql,Sql,我将直接切入主题:我有一个选择,我正在写一个相当长的where子句,我想做的是计算百分比 所以我需要的是所有结果的计数,然后是每个不同的计数 SELECT distinct count(*) FROM mytable WHERE mywhereclause ORDER BY columnIuseInWhereClause 可以很好地获取每个单独的值,但我不想做类似的事情 Select (Select count(*) from mytable WHERE mywhereclause),
SELECT distinct count(*)
FROM mytable
WHERE mywhereclause
ORDER BY columnIuseInWhereClause
可以很好地获取每个单独的值,但我不想做类似的事情
Select (Select count(*) from mytable WHERE mywhereclause),
distinct count(*)
FROM mytable
WHERE mywhereclause
因为我会两次使用相同的where子句,这似乎是不必要的
这是针对OracleDB的,但我只使用标准SQL语法,如果可以的话,不使用特定于数据库的语法
谢谢你的建议
编辑:
样本数据
__ID__,__someValue__
1 | A
2 | A
3 | B
4 | C
我要的是A,B,C的发生率以及总计数
__CountAll__,__ACounts__,__BCounts__,__CCounts__
4 | 2 | 1 | 1
所以我可以去
100% | 50% | 25% | 25%
这最后一部分我可能可以自己搞清楚。请原谅我缺乏经验,甚至缺乏逻辑思维,时间还早
编辑2:
我确实写了一个查询,虽然很有效,但很笨拙,而且很长。这是一个用于尝试分组方式的查询。尝试:
select count(*) as CountAll,
count(distinct SomeColumn) as CoundDistinct -- The DISTINCT goes inside the brackets
from myTable
where SomeOtherColumn = 'Something'
使用
case
表达式进行条件计数:
select count(*) as CountAll,
count(case when someValue = 'A' then 1 end) as ACounts,
count(case when someValue = 'B' then 1 end) as BCounts,
count(case when someValue = 'C' then 1 end) as CCounts
FROM mytable
WHERE mywhereclause
将其包装在派生表中,以轻松完成%部分:
select 100,
ACounts * 100 / CountAll,
BCounts * 100 / CountAll,
CCounts * 100 / CountAll
from
(
select count(*) as CountAll,
count(case when someValue = 'A' then 1 end) as ACounts,
count(case when someValue = 'B' then 1 end) as BCounts,
count(case when someValue = 'C' then 1 end) as CCounts
FROM mytable
WHERE mywhereclause
) dt
下面是一个使用窗口功能的替代方法:
with data_table(ID, some_value)
AS
(SELECT 1,'A' UNION ALL
SELECT 2,'A' UNION ALL
SELECT 3,'B' UNION ALL
SELECT 4,'C'
)
SELECT DISTINCT [some_value],
COUNT([some_value]) OVER () AS Count_All,
COUNT([some_value]) OVER (PARTITION BY [some_value]) AS 'Counts' FROM [data_table]
ORDER BY [some_value]
优点是你不必硬编码你的[some_value]你的第一个查询没有多大意义,而第二个查询更没有意义。。。你到底想干什么?添加一些示例表数据和预期结果(以及格式良好的文本)。我回答有点晚:(这是一个理解力很强的答案。+1对你来说非常好,我对案例内容一无所知。我的“笨拙且冗长”查询基本上是这样的,只是驱动的表是从单个SELECT COUNT(*)构建的)s、 非常感谢。