Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-统计列中不同值的出现次数_Sql_Postgresql - Fatal编程技术网

SQL-统计列中不同值的出现次数

SQL-统计列中不同值的出现次数,sql,postgresql,Sql,Postgresql,长话短说: 我有这样的桌子 nr sat col 1 1 dsag 1 2 gds 1 2 gds 2 1 gdsa 2 2 gf 2 3 gdsa 并期待这样的结果: nr Sat_1 Sat_2 Sat_3 1 1 2 0 2 1 1 1 我希望“选择不同的sat”中的每一行都有一个新列,下一个group by nr这可以使用条件聚

长话短说:

我有这样的桌子

nr   sat   col
1    1     dsag
1    2     gds
1    2     gds
2    1     gdsa
2    2     gf
2    3     gdsa
并期待这样的结果:

nr  Sat_1   Sat_2   Sat_3
1   1       2       0
2   1       1       1

我希望“选择不同的sat”中的每一行都有一个新列,下一个group by nr

这可以使用条件聚合来完成:

select nr, 
       count(*) filter (where sat = 1) as sat_1, 
       count(*) filter (where sat = 2) as sat_2, 
       count(*) filter (where sat = 3) as sat_3
from the_table
group by nr
order by nr;

在线示例:

这可以使用条件聚合来完成:

select nr, 
       count(*) filter (where sat = 1) as sat_1, 
       count(*) filter (where sat = 2) as sat_2, 
       count(*) filter (where sat = 3) as sat_3
from the_table
group by nr
order by nr;

在线示例:

我喜欢回答没有名字的马。这是较短的,但可能会稍微慢一些:

select nr, 
       sum((sat = 1)::int) as sat_1, 
       sum((sat = 2)::int) as sat_2, 
       sum((sat = 3)::int) as sat_3
from the_table
group by nr
order by nr;
编写查询的更典型的方法是使用
case

select nr, 
       sum(case when sat = 1 then 1 else 0 end) as sat_1, 
       . . .

这恰好是在许多数据库中运行的标准SQL。

我喜欢有“没有”名字的“马”。这是较短的,但可能会稍微慢一些:

select nr, 
       sum((sat = 1)::int) as sat_1, 
       sum((sat = 2)::int) as sat_2, 
       sum((sat = 3)::int) as sat_3
from the_table
group by nr
order by nr;
编写查询的更典型的方法是使用
case

select nr, 
       sum(case when sat = 1 then 1 else 0 end) as sat_1, 
       . . .

这恰好是将在许多数据库中运行的标准SQL。

“长话短说”-您需要使用
计数(不同列)
按nr分组,sat
来获得数字,使用
透视
来获得所需的显示。要使这篇短篇故事更长,请展示您已经尝试过的内容。“长篇故事短篇”-您需要使用
计数(不同列)
按nr分组,sat
来获取数字,使用
轴来获取所需显示。要使这个短篇故事更长,请展示您已经尝试过的内容。是的,我知道,但我不想手动执行,因为sat列中的值比本例中的值多得多。如果它能为每一个不同的数据自动创建“计数线”,那就太完美了value@dekarz当前位置你应该在问题中提到这一点。但总的来说,这是不可能的。在执行查询之前,数据库必须知道查询的列数。我明白了。无论如何,谢谢你,这似乎是最好的答案!:)但是我很失望,我不能像我想象的那样去做。据我所知,
filter
是可选的“高级OLAP操作”的一部分。它符合标准吗?@GordonLinoff HSQLDB还支持
过滤器,我知道,但我不想手动执行,因为sat列中的值比本例中的值多得多。如果它能为每一个不同的数据自动创建“计数线”,那就太完美了value@dekarz当前位置你应该在问题中提到这一点。但总的来说,这是不可能的。在执行查询之前,数据库必须知道查询的列数。我明白了。无论如何,谢谢你,这似乎是最好的答案!:)但是我很失望,我不能像我想象的那样去做。据我所知,
filter
是可选的“高级OLAP操作”的一部分。它符合标准吗?@GordonLinoff HSQLDB还支持
filter
子句
filter()
子句也是标准SQL;)@没有名字的马有没有标准sql特性的图表?哪些rdbms支持它?e、 g.就像你能找到的emca5/6和浏览器?我想不是真的,因为SQL标准不是免费的。我所知道的唯一一个类似的比较是:但这还远远不够,也不限于SQL标准中的功能。@a_horse_,带有_no_名称,谢谢链接!
filter()
子句也是标准SQL;)@没有名字的马有没有标准sql特性的图表?哪些rdbms支持它?e、 g.就像你能找到的emca5/6和浏览器?我想不是真的,因为SQL标准不是免费的。我所知道的唯一一个类似的比较是:但这还远远不够,也不限于SQL标准中的功能。@a_horse_,带有_no_名称,谢谢链接!