Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Oracle_Select_Group By - Fatal编程技术网

Sql 基于其他列值按查询分组

Sql 基于其他列值按查询分组,sql,oracle,select,group-by,Sql,Oracle,Select,Group By,假设我有一个名为process\u states的表: +--------+--------+ |Process | State | ------------------- | A | 0 | | A | 0 | | B | 0 | | B | -1 | | C | -99 | ------------------- Note: State can have many more negative an

假设我有一个名为
process\u states
的表:

+--------+--------+
|Process | State  |
-------------------
|   A    |   0    |
|   A    |   0    |
|   B    |   0    |
|   B    |  -1    |
|   C    |  -99   |
-------------------
Note: State can have many more negative and positive state values
我要查找所有具有状态为0的行的所有进程。在上述情况下,我想得到A

我正在尝试使用
分组方式
,有没有这样的方法:

select process from process_states 
group by process 
having <all state for that process is 0>
从进程状态中选择进程
分组处理
有

是否可以使用
分组依据

您可以
分组依据
处理列,并检查状态列的最大值和最小值是否为
0

select process 
from process_states
group by process
having max(state) = min(state) and min(state) = 0

您可以使用
having
子句来完成此操作。如果给定进程的行数等于带零的行数,则表示该进程只有带零的行

select process
  from process_states
 group by process
 having count(*) = count(case when state = 0 then 'X' end)

您可以使用
group by
子句,并使用
having
子句过滤流程:

SELECT   process
FROM     process_states
GROUP BY process
HAVING   COUNT(CASE state WHEN -1 THEN 1 END) = 0
编辑:

根据对其他答案的澄清意见,如果要求只查找只有
0
状态的流程,则可以计算总行数和
0
状态的行数,并进行比较:

SELECT   process
FROM     process_states
GROUP BY process
HAVING   COUNT(CASE state WHEN 0 THEN 1 END) = COUNT(*)

我很想使用
min
来实现以下目的:

select process
from process_status
group by process
having min(status) > -1;
这确实假设没有其他负面状态。

试试这个

select process
from process_status
group by process
having sum(abs(status))  = 0

这正是我想要的。谢谢:)接下来的问题是,如果我想找到所有进程都有0或1,我可以在计数中使用
吗?对于任何不仅仅是等式检查的简写形式的条件,您必须使用较长形式的
case
计数(状态为(0,1)时为case,然后为1 END)
。当然,您可以只使用两个
when
子句:
计数(0时的大小写状态为0,然后1时的大小写状态为1,然后1结束)
,但是,很糟糕。接下来的问题是,如果我想找到所有进程都有0或1,我可以在计数中使用
吗?将
when state=0
更改为
when state in(0,1)