Sql 在计数之后选择不同的计数?

Sql 在计数之后选择不同的计数?,sql,Sql,我将直接切入主题:我有一个选择,我正在写一个相当长的where子句,我想做的是计算百分比 所以我需要的是所有结果的计数,然后是每个不同的计数 SELECT distinct count(*) FROM mytable WHERE mywhereclause ORDER BY columnIuseInWhereClause 可以很好地获取每个单独的值,但我不想做类似的事情 Select (Select count(*) from mytable WHERE mywhereclause),

我将直接切入主题:我有一个选择,我正在写一个相当长的where子句,我想做的是计算百分比

所以我需要的是所有结果的计数,然后是每个不同的计数

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