添加具有以下内容的新选择字段

时间:2019-02-21 15:37:58

标签: mysql

这是一个mysql问题。
这是一个简单的表,需要按groupid进行分组。(只是组成,除了解决问题外没有其他用途)

id car  house  pets   groupid
1   1     2    1        1
1   0     1    0        1
1   0     0    0        1
SELECT SUM(car),SUM(house),SUM(pets) FROM table GROUP BY id

所以结果是

car 1 house 3 pets 1

我要尝试的是向组“ any_record_with_all_zeros”中插入一个新的选定字段,如果该组有一行,其中car = 0房屋= 0宠物= 0,则为0

所以期望的结果是

car 1,house 3, pets 1, any_record_with_all_zeros = 1 

如果id 3行的any字段不是0,则'any_record_with_all_zeros为0'

我知道即时通讯应该与HAVING一起使用,但是我不知道如何将“ any_record ...”字段放入SELECT部分​​。

SELECT 
 SUM(car),SUM(house),SUM(pets),any_record_with_all_zeros
FROM 
 table
GROUP BY
 groupid
HAVING if car=0 && house=0 && pets=0 than any_record_with_all_zeros = 0 or something similar

有什么主意吗?

3 个答案:

答案 0 :(得分:1)

您可以检查汽车,房屋和宠物

SELECT 
 SUM(car)
 ,SUM(house)
 ,SUM(pets)
 , sum (case when (car + house + pets)  = 0 then 1 else 0 end) any_record_with_all_zeros
FROM   table
GROUP BY groupid

答案 1 :(得分:1)

您可以使用BIT_OR()聚合函数。如果来自组的任何设置值都为TRUE,则BIT_OR也将返回TRUE。

SELECT groupid
  , SUM(car)
  , SUM(house)
  , SUM(pets)
  , BIT_OR((car, house, pets) = (0, 0, 0)) as any_record_with_all_zeros
FROM `table`
GROUP BY groupid

答案 2 :(得分:1)

总结几个Bitwise OR的NOT也是可以的。

create table `table` (
 id int primary key auto_increment, 
 groupid int not null, 
 car int not null default 0,
 house int not null default 0,
 pet int not null default 0
);
insert into `table` (groupid, car, house, pet) values
 (1, 1, 2, 1)
,(1, 0, 1, 0)
,(1, 0, 0, 0)
-- ,(1, 0, 0, 0)
-- ,(1, 0, 0, 0)
;
SELECT 
groupid, 
SUM(car) as cars, 
SUM(house) as houses, 
SUM(pet) as pets, 
SUM(not(car | house | pet)) as none
FROM `table`
GROUP BY groupid
groupid | cars | houses | pets | none
------: | ---: | -----: | ---: | ---:
      1 |    1 |      3 |    1 |    1

db <>提琴here