UNION 操作符
UNION
是 SQL 中的集合操作符,用于合并两个或多个 SELECT 语句的结果集。以下是关于 UNION
的详细说明:
基本概念
UNION
操作符用于将多个查询结果合并为一个结果集,它会自动去除重复的行。
基本语法
SELECT 列1, 列2, ... FROM 表1
UNION
SELECT 列1, 列2, ... FROM 表2;
使用规则
列数必须相同:所有 SELECT 语句必须有相同数量的列
数据类型必须兼容:对应列的数据类型应该相似
列名以第一个查询为准:结果集的列名采用第一个 SELECT 语句的列名
UNION 与 UNION ALL 的区别
操作符 | 功能 | 性能 |
---|---|---|
UNION | 合并结果并去除重复行 | 较慢 |
UNION ALL | 合并结果但保留所有行(包括重复行) | 较快 |
PIVOT 操作
PIVOT 是 SQL 中的一种行转列操作,它可以将行数据转换为列数据,常用于数据透视和交叉表报表的生成。
基本概念
PIVOT 操作将某一列的唯一值转换为结果集中的多个列,并对相关数据进行聚合计算。
基本语法
SELECT 非透视列, [第一个透视值] AS 列名1, [第二个透视值] AS 列名2, ... FROM (SELECT 查询语句) AS 源表 PIVOT ( 聚合函数(值列) FOR 透视列 IN ([第一个透视值], [第二个透视值], ...) ) AS 透视表别名
在查询中的应用
在您的原始查询中,PIVOT 将护理项目代码转换为易读的列名:
PIVOT ( MAX(NUM) FOR CONTENT IN ( '1' AS 口腔护理, '2' AS 会阴护理, '3' AS 气压治疗, '4' AS 机械辅助排痰, '5' AS 雾化吸入, 'BLOODSUGAR_VALUE' AS 血糖次数 ) )
PIVOT 操作的关键要素
聚合函数:必须指定一个聚合函数(如 MAX, SUM, COUNT 等)
透视列:指定要转换为列名的列
值列:包含要聚合的值的
注意事项
需要预先知道要转换的所有可能值
结果集的列数是动态的,取决于透视列中的唯一值数量
在某些数据库中语法可能略有不同
nvl()与nvl2()
语法结构:
NVL(expression1, expression2) 根据参数1是否为NULL值来返回参数1或者参数2
NVL2(expression1, expression2, expression1) 根据参数1是否为NULL值来返回参数2或者参数3
NVL()
若expression1值为null,则该函数返回expression2;
若expression1值不为null,则该函数返回expression1;
若expression1、expression2的值均为null,则该函数返回null。
注:参数expression1和expression2可以是字符型、数字型或日期型,但参数expression1与expression2的类型必须一致。
NVL2()
若expression1值不为null,则该函数返回expression2值;
若expression1值为null,则该函数返回expression3值;
若expression1、expression2、expression3值均为null,则该函数返回null。
注:expression1的类型不需要与expression2和expression3的类型保持一致; expression2与expression3的类型尽量保持一致,若不一致,当expression1为null时,则expression3会自动转换为expression2的类型,若两个数据类型之间无法转换,则会报错。
RTRIM、LTRIM、TRIM
LTRIM、RTRIM和TRIM是用于去除字符串两端空格或指定字符的函数
LTRIM:
删除左边空格或者指定字符
RTRIM:
删除右边空格或者指定字符
TRIM:
语法:SELECT TRIM(',' FROM ",Hello,");
支持指定删除字符
案例
CREATE OR REPLACE VIEW V_DT_BEDINFO AS
WITH RankedScores AS (
SELECT
pi.inpatient_no AS InpatientNumber,
pi.patient_name AS PatientName, -- 添加患者姓名字段
ps.time_point AS insert_time,
-- 压力性损伤
CASE
WHEN ps.score_code = 'SCORE_BRADEN' THEN
CASE
WHEN ps.grade_code = 'S_1' THEN '压疮低风险'
WHEN ps.grade_code = 'S_2' THEN '压疮中风险'
END
END AS Matter_2,
-- 非计划拔管
CASE
WHEN ps.score_code = 'SCORE_UEX' THEN
CASE
WHEN ps.grade_code = 'S_3' THEN '预防管道滑脱'
END
END AS Matter_3,
-- 跌倒
CASE
WHEN ps.score_code = 'SCORE_MORSE' THEN
CASE
WHEN ps.grade_code = 'S_0' THEN '跌倒低风险'
WHEN ps.grade_code = 'S_2' THEN '跌倒中风险'
END
END AS Matter_1,
ps.score_value,
ps.score_code,
ROW_NUMBER() OVER (
PARTITION BY ps.inpatient_visit_id, ps.score_code
ORDER BY ps.time_point DESC
) AS rn
FROM mts_patient_score ps
LEFT JOIN mts_patient_inward pi ON pi.inpatient_visit_id = ps.inpatient_visit_id
)
SELECT
InpatientNumber,
PatientName,
RTRIM(
NVL2(MAX(Matter_1), MAX(Matter_1) || '|', '') ||
NVL2(MAX(Matter_2), MAX(Matter_2) || '|', '') ||
NVL2(MAX(Matter_3), MAX(Matter_3), ''),
'|') AS CombinedMatters
FROM RankedScores
WHERE rn = 1
GROUP BY InpatientNumber, PatientName;
|´・ω・)ノ