sql 计算某个值的占比_SQL:计算共享公用列值的行组

sql 计算某个值的占比

在本文中,我将重点介绍使用简单的SQL SELECT语句对满足特定条件的表中的行数进行计数,并将结果按表的特定列分组。 这些都是SQL的基本概念,但是将它们混合使用就可以对关系数据库中存储的数据进行不同且有用的表示。 本文中涉及SQL查询的特定方面并用简单的示例进行了说明,它们是聚合函数count()WHEREGROUP BYHAVING 。 这些将用于构建简单的单个SQL查询,该查询指示表中与该表中给定列的不同值匹配的行数。

我需要一些简单SQL数据进行演示。 以下SQL代码演示了在PostgreSQL数据库中如何创建名为ALBUMS的表,然后使用INSERT语句填充该表。

createAndPopulateAlbums.sql

CREATE TABLE albums
(
   title text,
   artist text,
   year integer
);

INSERT INTO albums (title, artist, year)
   VALUES ('Back in Black', 'AC/DC', 1980);
INSERT INTO albums (title, artist, year)
   VALUES ('Slippery When Wet', 'Bon Jovi', 1986);
INSERT INTO albums (title, artist, year)
   VALUES ('Third Stage', 'Boston', 1986);
INSERT INTO albums (title, artist, year)
   VALUES ('Hysteria', 'Def Leppard', 1987);
INSERT INTO albums (title, artist, year)
   VALUES ('Some Great Reward', 'Depeche Mode', 1984);
INSERT INTO albums (title, artist, year)
   VALUES ('Violator', 'Depeche Mode', 1990);
INSERT INTO albums (title, artist, year)
   VALUES ('Brothers in Arms', 'Dire Straits', 1985);
INSERT INTO albums (title, artist, year)
   VALUES ('Rio', 'Duran Duran', 1982);
INSERT INTO albums (title, artist, year)
   VALUES ('Hotel California', 'Eagles', 1976);
INSERT INTO albums (title, artist, year)
   VALUES ('Rumours', 'Fleetwood Mac', 1977);
INSERT INTO albums (title, artist, year)
   VALUES ('Kick', 'INXS', 1987);
INSERT INTO albums (title, artist, year)
   VALUES ('Appetite for Destruction', 'Guns N'' Roses', 1987);
INSERT INTO albums (title, artist, year)
   VALUES ('Thriller', 'Michael Jackson', 1982);
INSERT INTO albums (title, artist, year)
   VALUES ('Welcome to the Real World', 'Mr. Mister', 1985);
INSERT INTO albums (title, artist, year)
   VALUES ('Never Mind', 'Nirvana', 1991);
INSERT INTO albums (title, artist, year)
   VALUES ('Please', 'Pet Shop Boys', 1986);
INSERT INTO albums (title, artist, year)
   VALUES ('The Dark Side of the Moon', 'Pink Floyd', 1973);
INSERT INTO albums (title, artist, year)
   VALUES ('Look Sharp!', 'Roxette', 1988);
INSERT INTO albums (title, artist, year)
   VALUES ('Songs from the Big Chair', 'Tears for Fears', 1985);
INSERT INTO albums (title, artist, year)
   VALUES ('Synchronicity', 'The Police', 1983);
INSERT INTO albums (title, artist, year)
   VALUES ('Into the Gap', 'Thompson Twins', 1984);
INSERT INTO albums (title, artist, year)
   VALUES ('The Joshua Tree', 'U2', 1987);
INSERT INTO albums (title, artist, year)
   VALUES ('1984', 'Van Halen', 1984);

接下来的两个屏幕快照显示了在psql中运行此脚本的结果:

albumsTableCreated

201603-专辑行

在这一点上,如果我想查看每年发行了多少张专辑,可以使用以下几个单独SQL查询语句:

SELECT count(1) FROM albums where year = 1985;
SELECT count(1) FROM albums where year = 1987;

201603-select年份专辑1985_1987

可能需要查看每年发行多少张专辑而无需每年进行单独查询。 这是在使用带有GROUP BY子句的count()之类的聚合函数时很方便的地方。 下一个查询很简单,但是利用GROUP BY来显示按专辑发行年分组的每个“组”行的计数。

SELECT year, count(1)
  FROM albums
 GROUP BY year;

201603-专辑计数分组年份

通过指定缩小条件,可以正常使用WHERE子句来缩小返回的行数。 例如,以下查询返回在1988年之后的一年中发行的专辑。

SELECT year, count(1)
  FROM albums
 WHERE year > 1988
 GROUP BY year;

201603-专辑1988年后

我们可能只想返回表中有多张专辑(不止一张)的年份。 第一个天真的方法可能如下所示(不起作用,如下面的屏幕快照所示):

-- Bad Code!: Don't do this.
SELECT year, count(1)
  FROM albums
 WHERE count(1) > 1
 GROUP BY year;

201603-noWhereOnAggregateFunction

上一个屏幕快照显示“在WHERE中不允许使用聚合函数”。 换句话说,我们不能在WHERE子句中使用count() 。 这是HAVING子句有用的地方,因为HAVING缩小结果的方式与WHERE相似,但是与聚合函数和GROUP BY

下一个SQL清单演示了如何使用HAVING子句来完成较早尝试的任务(列出表中存在多个专辑行的年份):

SELECT year, count(1)
  FROM albums
 GROUP BY year
HAVING count(1) > 1;

201603年有多个专辑

最后,我可能希望对结果进行排序,以便将它们以递增(较晚)的年份列出。 这里显示了前面演示的两个SQL查询,其中添加了ORDER BY

SELECT year, count(1)
  FROM albums
 GROUP BY year
 ORDER BY year;

201603-专辑群组订购

SELECT year, count(1)
  FROM albums
 GROUP BY year
HAVING count(1) > 1
 ORDER BY year;

201603-havingGroupByOrderBy

与我刚开始使用SQL相比,SQL已经成为一种更加丰富的语言,但是多年来可用的基本SQL仍然有效且有用。 尽管本文中的示例已使用PostgreSQL进行了演示,但这些示例应在实现ANSI SQL的大多数关系数据库上运行。

翻译自: https://www.javacodegeeks.com/2016/03/sql-counting-groups-rows-sharing-common-column-values.html

sql 计算某个值的占比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值