SQL视图操作符

UNION 操作符

UNION 是 SQL 中的集合操作符,用于合并两个或多个 SELECT 语句的结果集。以下是关于 UNION 的详细说明:

基本概念

UNION 操作符用于将多个查询结果合并为一个结果集,它会自动去除重复的行。

基本语法

SELECT 列1, 列2, ... FROM 表1
UNION
SELECT 列1, 列2, ... FROM 表2;

使用规则

  1. 列数必须相同:所有 SELECT 语句必须有相同数量的列

  2. 数据类型必须兼容:对应列的数据类型应该相似

  3. 列名以第一个查询为准:结果集的列名采用第一个 SELECT 语句的列名

UNION 与 UNION ALL 的区别

操作符功能性能
UNION合并结果并去除重复行较慢
UNION ALL合并结果但保留所有行(包括重复行)较快

PIVOT 操作

PIVOT 是 SQL 中的一种行转列操作,它可以将行数据转换为列数据,常用于数据透视和交叉表报表的生成。

基本概念

PIVOT 操作将某一列的唯一值转换为结果集中的多个列,并对相关数据进行聚合计算。

基本语法

sql
 
SELECT 非透视列, [第一个透视值] AS 列名1, [第二个透视值] AS 列名2, ...
FROM 
    (SELECT 查询语句) AS 源表
PIVOT
(
    聚合函数(值列)
    FOR 透视列 IN ([第一个透视值], [第二个透视值], ...)
) AS 透视表别名

在查询中的应用

在您的原始查询中,PIVOT 将护理项目代码转换为易读的列名:

sql
 
PIVOT (
    MAX(NUM) FOR CONTENT IN (
        '1' AS 口腔护理,
        '2' AS 会阴护理,
        '3' AS 气压治疗,
        '4' AS 机械辅助排痰,
        '5' AS 雾化吸入,
        'BLOODSUGAR_VALUE' AS 血糖次数
    )
)

PIVOT 操作的关键要素

  1. 聚合函数:必须指定一个聚合函数(如 MAX, SUM, COUNT 等)

  2. 透视列:指定要转换为列名的列

  3. 值列:包含要聚合的值的

注意事项

  1. 需要预先知道要转换的所有可能值

  2. 结果集的列数是动态的,取决于透视列中的唯一值数量

  3. 在某些数据库中语法可能略有不同

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;

评论

  1. 测试
    3 周前
    2025-7-15 18:03:44

    |´・ω・)ノ

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇