首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL 9.6使用基于列总和的case-when子句

PostgreSQL 9.6使用基于列总和的case-when子句
EN

Stack Overflow用户
提问于 2017-07-16 22:52:20
回答 1查看 938关注 0票数 0

下面是创建和插入脚本:

代码语言:javascript
复制
CREATE TABLE numbers (
  id integer NOT NULL,
  number1 integer NOT NULL
);

INSERT INTO numbers (id, number1) VALUES
  ('1', '1'),
  ('2', '1'),
  ('1', '2'),
  ('1', '3');

如果number1列总和为偶数,则返回平均值,否则返回0。因此,对于上面的示例,它应该返回id:1,number1 1:0

我已经尝试过了:

代码语言:javascript
复制
select id,
  case
    when sum(number1) %2=1 then 0 else avg(number1)
  end as number1
from numbers

它在mySql上运行得很好,但在PostgreSQL上就不行(我是用http://sqlfiddle.com来试用的)。PostgreSQL中的错误消息是

代码语言:javascript
复制
 ERROR: column "numbers.id" must appear in the GROUP BY clause or be used in an aggregate function
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-16 23:14:11

为什么id的期望值是1而不是2?这是由查询以某种方式定义的吗?与Postgres (和其他著名的关系型数据库管理系统)相反,MySql并不关心它。

如果id的值可以忽略不计:

代码语言:javascript
复制
select
    case
        when sum(number1) %2 = 1 then 0 
        else avg(number1)
    end as number1
from numbers;

 number1 
---------
       0
(1 row) 

例如,如果您想要获得id的最小值

代码语言:javascript
复制
select
    min(id) as id,
    case
        when sum(number1) %2 = 1 then 0 
        else avg(number1)
    end as number1
from numbers;

 id | number1 
----+---------
  1 |       0
(1 row) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45129912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档