我正在研究SQL的实现,它应该在Where和Having Clause之间显示Union操作的结果。 例如,
Select * from table where col1= 'get' group by col2 (OR/UNION) having avg(col3) >30 . This is not valid but trying to give use a case
sql语句的目的是返回满足where和having条件的结果集。
假设我有一个table1,表中包含col1,col2,col3,col4和大数据。现在,有一个用例,当用户在过滤器列表中选择具有特定crtieria col1 ='Y',avg(col2)> 10,avg(col3 * col4)= 30的过滤器时,想要查看结果。现在,我必须创建一个标准,这样,我应该返回满足col1 ='Y'或avg(col2)> 10 OR avg(col3 * col4)= 30的所有结果,就像我们在带有OR的where子句中一样运算符,但在这里我们有where子句和having子句 -
Like, the below query
resultset1< = select * from table1,其中col1 ='get'; resultset2< = select * from table1 group by col2 have avg(col3)> 30
最终结果= resultset1 + resultset2 在实施这种情况时,是否有任何人有更好的方法或想法?
假设我有以下过滤器组合
col1 = 23 要么 avg(col2)> 30 和 avg(col3)= 10 要么 avg(col1)< 10 和 col2 = 10
我需要在SQL
中显示满足这些条件的结果答案 0 :(得分:0)
目前还不清楚你对这个准SQL有什么要求。我想你需要选择两个条件col1= 'get'
和/或? having avg(col3) >30
。所以这是解决方案:
Select * from table
where (col1= 'get')
OR
col2 in (SELECT col2 FROM table GROUP BY col2 HAVING avg(col3) >30)
如果您需要两个条件均为true,则将OR替换为AND。
如果您只需要为col1 = 'get'
计算AVG,请将此条件添加到子查询中:
Select * from table
where (col1= 'get')
OR
col2 in (SELECT col2 FROM table WHERE (col1= 'get')
GROUP BY col2
HAVING avg(col3) >30)
答案 1 :(得分:0)
SELECT <resultset1> --resultset based on a WHERE clause
UNION
SELECT <resultset2> --resultset based on HAVING
通常,如果您想要结果集的并集,请使用... UNION。
在条件中使用OR等同于UNION(因为UNION运算符是逻辑析取的等价关系代数),但它要求所涉及条件的范围相同。
在这种情况下,这是不可能的,因为HAVING条件不适用于SELECT中提到的表,而是适用于静默&#34;中的表。由GROUP子句创建。这是不可避免的,因为像AVG,SUM这样的东西只有在确定 必须使用哪组行 来计算AVG,SUM时才有意义。 ......结束了,这就是GROUP BY规范的作用。
修改
在SQL中,UNION有不同的风格,UNION DISTINCT和UNION ALL。一个消除重复,另一个赢了。如果您想要与OR完全相同的行为,那么您显然需要从结果集中消除重复的行为。