2017-02-20 33 views
0

我会切入正题:我有一个选择,我正在写一个比较冗长的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的occurances的号码以及整体计数。

__CountAll__,__ACounts__,__BCounts__,__CCounts__ 
    4  |  2  |  1  |  1 

这样我就可以得到

100%  | 50% | 25% | 25% 

这最后一部分,我可以大概判断出我自己。请原谅我缺乏经验,甚至逻辑思维,这是凌晨。 ;)

编辑2: 我确实已经写了一个有效的查询,但很笨拙,只要所有圣洁的heck,这一个是为了与group by一起尝试。

+0

你的第一个查询没有多大意义,甚至更少,第二个......你到底是想什么做?添加一些示例表格数据和预期结果(以及格式化文本)。 – jarlh

回答

0

使用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 
+0

非常整洁,我对这件事情一无所知。我的“笨拙而长久的所有圣洁”查询基本上是这样的,只有颂表是由单独的SELECT COUNT(*)s构造的。非常感谢。 – Wep0n

1

尝试:

select count(*) as CountAll, 
     count(distinct SomeColumn) as CoundDistinct -- The DISTINCT goes inside the brackets 
from myTable 
where SomeOtherColumn = 'Something' 
+0

我有点迟到回答:(这是一个很好的理解答案。+1对你来说 – Susang

0

这里的替代使用窗口功能:

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]