having设置条件 包含case when 定义聚合键
时间: 2023-07-08 07:45:44 浏览: 96
在Hive中,可以使用HAVING语句在GROUP BY子句的结果集上设置条件。如果我们想要基于case when语句定义的聚合键,对结果集进行过滤,可以将case when语句嵌套在HAVING语句中。例如:
```
SELECT
subject,
AVG(score) AS avg_score,
CASE
WHEN AVG(score) >= 90 THEN '优秀'
WHEN AVG(score) >= 80 THEN '良好'
WHEN AVG(score) >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM
scores
GROUP BY
subject
HAVING
SUM(CASE
WHEN score >= 60 THEN 1
ELSE 0
END) / COUNT(*) >= 0.8;
```
在上述HiveQL语句中,我们使用HAVING语句过滤了平均成绩及格率大于等于80%的科目。在HAVING语句中,我们使用SUM和CASE WHEN语句来计算及格成绩的数量,使用COUNT函数计算总成绩数量,并将二者相除得到及格率。这样就可以方便地对成绩进行筛选和分析。
相关问题
数据库条件查询可以使用where子句、case…when子句以及having关键字,简要说明其用法区别?
数据库条件查询中,`WHERE`, `CASE...WHEN` 和 `HAVING` 都用于过滤数据,但它们的应用场景和作用略有不同:
1. **WHERE** 子句:通常用于基础的行级筛选,它在FROM子句之后,用于指定哪些记录应该包含在结果集中。它基于列值进行判断,可以匹配特定的值、范围、运算符等,例如 `SELECT * FROM table WHERE column = 'value'`。
2. **CASE...WHEN** 子句:这是一个条件表达式,用于对单个字段进行更复杂的条件测试并返回不同的值。它会检查每个 WHEN 子句的条件是否满足,并根据第一个满足的条件返回对应的 THEN 结果。如果所有 WHEN 都不满足,则可以选择一个 ELSE 或 DEFAULT 分支。例如:
```
SELECT column,
CASE
WHEN condition THEN 'Result1'
WHEN condition2 THEN 'Result2'
ELSE 'Default Result'
END as new_column
FROM table
```
3. **HAVING** 子句:主要用于聚合函数(如 COUNT(), SUM(), AVG() 等)的结果上,与 GROUP BY 一起使用。当你需要基于分组后的数据进行过滤时,才使用 HAVING,比如找出销售额大于某个值的产品组。示例:
```
SELECT product_group, SUM(sales) as total_sales
FROM sales_table
GROUP BY product_group
HAVING total_sales > 10000
```
3、条件查询可以使用where子句、case…when子句以及having关键字,简要说明其用法区别?
在 SQL 中,`WHERE`, `CASE...WHEN` 和 `HAVING` 子句都是用于过滤数据库查询结果的重要部分,各有其特定用途:
1. **WHERE** 子句:这是最基本的条件筛选语句,用于基于列的值确定哪些行应该出现在查询结果中。它应用于 SELECT 语句的主表上,对每一行进行检查,只返回满足给定条件的行。例如:
```
SELECT * FROM table_name WHERE column_name = 'some_value';
```
2. **CASE...WHEN** 子句:这是一种条件表达式,用于根据条件返回不同的值。它主要用于计算列的值,而不是直接筛选行。比如,你可以创建一个新的列,根据原列的不同值返回不同的结果:
```
SELECT column_name,
CASE WHEN condition THEN 'result1' ELSE 'result2' END AS new_column
FROM table_name;
```
3. **HAVING** 子句:不同于 WHERE,HAVING 用于对 GROUP BY 分组后的数据进行过滤。这意味着它只能应用在聚合函数(如 SUM, COUNT, AVG 等)之后的结果上,因为只有聚合后的数据才有分组的概念。例如:
```
SELECT column1, COUNT(*) as count
FROM table_name
GROUP BY column1
HAVING COUNT(*) > 5;
```
这里会返回每个 `column1` 值分组后,计数大于5的记录。
总结来说,WHERE 用于单行级别的筛选,CASE...WHEN 主要用于列级计算,而 HAVING 用于对分组后的数据进行条件筛选。
阅读全文