写一段sql 用case when来判断, 如果第二行有数据 取第二行数据,如果没有取第一行数据 数据在一列里面
时间: 2024-05-29 20:10:04 浏览: 91
假设需要查询的表名为table1,列名为column1,以下是使用case when语句来判断并选择对应数据的SQL:
SELECT
CASE WHEN column1 IS NOT NULL AND EXISTS (SELECT 1 FROM table1 WHERE column1 IS NOT NULL LIMIT 1 OFFSET 1)
THEN (SELECT column1 FROM table1 WHERE column1 IS NOT NULL LIMIT 1 OFFSET 1)
ELSE column1
END AS selected_data
FROM table1;
解释:
- 第一行判断列column1是否为空以及是否有第二行数据,如果成立,则选择第二行数据;否则选择第一行数据。
- 第二行使用子查询来判断是否有第二行数据。
- 第三行是选择语句,将选择的数据命名为selected_data。
- 第四行是指定查询的表名为table1。
相关问题
case when 分层
### 使用 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` 中利用这两个指标构建了综合评价分数体系,并最终筛选出所有具有有效得分的结果集。
oracle 写一段sql,组成由一段随机数字组成的结果,第一位数字范围1、2、3,第二位4、5、6,第三位9、10、11,第四位14、15、16,第五位22、23、24,第六位27、28、29,第七位4、5、6、9、10
要生成这样的随机数字组合,可以使用Oracle SQL的`DBMS_RANDOM.VALUE`函数来生成随机数,然后通过条件判断来限制数字范围。下面是一个可能的实现方式:
```sql
SELECT
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 0 THEN 1
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 1 THEN 2
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 2 THEN 3
END AS first_digit,
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 0 THEN 4
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 1 THEN 5
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 2 THEN 6
END AS second_digit,
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 0 THEN 9
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 1 THEN 10
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 2 THEN 11
END AS third_digit,
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 0 THEN 14
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 1 THEN 15
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 2 THEN 16
END AS fourth_digit,
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 0 THEN 22
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 1 THEN 23
WHEN MOD(DBMS_RANDOM.VALUE(1, 3), 1) = 2 THEN 24
END AS fifth_digit,
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 0 THEN 4
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 1 THEN 5
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 2 THEN 6
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 3 THEN 9
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 4 THEN 10
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 4 THEN 29 -- 注意这里有一个错误,应该排除重复的10
END AS sixth_digit,
CASE
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 0 THEN 4
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 1 THEN 5
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 2 THEN 6
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 3 THEN 9
WHEN MOD(DBMS_RANDOM.VALUE(1, 5), 1) = 4 THEN 10
END AS seventh_digit
FROM dual;
```
需要注意的是,`DBMS_RANDOM.VALUE`函数生成的是0到1之间的随机数,通过取模操作和整除来限制到所需的数字范围,并确保每个数字只生成一次。另外,由于`CASE`语句中有一个错误,第七位数字的生成规则应排除重复的10。
阅读全文
相关推荐














