case when 分层
时间: 2024-12-30 22:18:14 浏览: 7
### 使用 SQL 中的 CASE WHEN 进行分层查询
在 SQL 查询中,`CASE WHEN` 结构用于处理复杂的数据分组和条件逻辑。通过 `CASE WHEN` 可以实现基于特定条件的不同计算路径,从而达到数据分层的效果。
#### 简单案例:按成绩等级划分学生
假设有一个学生成绩表 `student_grades`,包含学生的姓名 (`name`) 和 GPA 成绩 (`gpa`)。现在希望根据 GPA 的范围对学生进行分级:
```sql
SELECT
name,
gpa,
CASE
WHEN gpa >= 3.8 THEN 'A'
WHEN gpa >= 3.0 AND gpa < 3.8 THEN 'B'
WHEN gpa >= 2.0 AND gpa < 3.0 THEN 'C'
ELSE 'D'
END AS grade_level
FROM student_grades;
```
此查询会返回每位学生的名称、原始 GPA 值以及按照上述规则定义的成绩级别[^1]。
#### 复杂场景下的应用——多维度数据分析
对于更复杂的业务需求,比如分析销售记录并根据不同标准对销售人员的表现打分,则可以通过组合多个 `CASE WHEN` 来完成这一目标。这里给出一个简单的例子,展示如何在一个报表里同时考虑销售额度和个人贡献率两个因素来进行评分:
```sql
WITH sales_data AS (
SELECT
employee_id,
SUM(sales_amount) OVER (PARTITION BY employee_id ORDER BY sale_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales,
COUNT(*) OVER (PARTITION BY employee_id) AS total_transactions
FROM sales_records
),
evaluation_results AS (
SELECT *,
CASE
WHEN cumulative_sales > 50000 THEN 5 -- 高额销售者得满分
WHEN cumulative_sales BETWEEN 30000 AND 50000 THEN 4
WHEN cumulative_sales BETWEEN 10000 AND 30000 THEN 3
WHEN cumulative_sales BETWEEN 5000 AND 10000 THEN 2
ELSE 1
END +
CASE
WHEN total_transactions / DATEDIFF(MAX(sale_date), MIN(sale_date)) > 5 THEN 5 -- 平均每天超过五笔交易加满分为奖励
WHEN total_transactions / DATEDIFF(MAX(sale_date), MIN(sale_date)) BETWEEN 3 AND 5 THEN 4
WHEN total_transactions / DATEDIFF(MAX(sale_date), MIN(sale_date)) BETWEEN 1 AND 3 THEN 3
WHEN total_transactions / DATEDIFF(MAX(sale_date), MIN(sale_date)) BETWEEN 0 AND 1 THEN 2
ELSE 1
END AS overall_score
FROM sales_data sd
)
SELECT * FROM evaluation_results er WHERE overall_score IS NOT NULL;
```
这段代码首先创建了一个名为 `sales_data` 的临时视图来获取每个员工累计销售额及其总的交易次数;接着,在第二个 CTE(Common Table Expression)即 `evaluation_results` 中利用这两个指标构建了综合评价分数体系,并最终筛选出所有具有有效得分的结果集。
阅读全文