我有下表:
NAME
Alex
Bob
Bob
Tim
Alex
Roger
我需要制作以下内容:
Name Count Percentage
Alex 2 33%
Bob 2 33%
Roger 1 16.6%
Tim 1 16.6%
我不知道从哪里开始。我可以对计数进行初始查询,这很简单。
我有下表:
NAME
Alex
Bob
Bob
Tim
Alex
Roger
我需要制作以下内容:
Name Count Percentage
Alex 2 33%
Bob 2 33%
Roger 1 16.6%
Tim 1 16.6%
我不知道从哪里开始。我可以对计数进行初始查询,这很简单。
可以用一个
SELECT
:count(*)
是函数的单独形式, 比count(<expression>)
. 假设所有列都是NOT NULL
,否则您可能必须使用后者。您可以运行窗口聚合函数
sum(count(*)) OVER ()
以获取相同的总数SELECT
。考虑 a 中的事件序列SELECT
:这使用一次顺序扫描而不是两次,并且通常比使用子查询的总计数快两倍。
to_char()
美化输出:这是使用窗口函数的好机会:
这会产生如下输出:
如果您想要稍微不同的格式,您可以调整舍入代码。您也可以将 a 连接
%
到pct
列值,但您需要text
先将其强制转换,并且结果列将text
相反numeric
(这可能适合您的情况)。这种查询方式的一大优势是,如果您的表变得更复杂,并且有更多列,您仍然可以处理该数据,甚至在查询中返回它,但仍然可以访问计数和百分比数据,因为窗口函数作用域的工作方式。如果您删除不同的,即使是同名,您也可以按行获取它。
SQL小提琴
小提琴
我觉得我可能有点作弊,但这应该得到你的结果:
一种方法是使用子查询:
示例 SQL 小提琴