WITH dims AS (
SELECT 1 AS sort_id, '全部融资租赁资产' AS 分组1, '全部融资租赁资产' AS 行标签, 'all' AS cat_code FROM DUAL UNION ALL
SELECT 2, '按租赁物所属类别分类', '设备类', 'device' FROM DUAL UNION ALL
SELECT 3, '按租赁物所属类别分类', ' 其中,道路运输设备', 'road' FROM DUAL UNION ALL
SELECT 4, '按租赁物所属类别分类', ' 其中,乘用车', 'car' FROM DUAL UNION ALL
SELECT 5, '按租赁物所属类别分类', ' 商用车', 'truck' FROM DUAL UNION ALL
SELECT 6, '按租赁物所属类别分类', ' 消防、救护等特种车辆', 'empty' FROM DUAL UNION ALL
SELECT 7, '按租赁物所属类别分类', ' 轨道交通车辆(含铁路运输设备)', 'empty' FROM DUAL UNION ALL
SELECT 8, '按租赁物所属类别分类', ' 摩托车、电动车辆、非机动车', 'empty' FROM DUAL UNION ALL
SELECT 9, '按租赁物所属类别分类', ' 水上交通运输设备(船舶海工设备)', 'empty' FROM DUAL UNION ALL
SELECT 10, '按租赁物所属类别分类', ' 航空运输设备(航空器及其配套设备)', 'air' FROM DUAL UNION ALL
SELECT 11, '按租赁物所属类别分类', ' 医疗设备', 'medical' FROM DUAL UNION ALL
SELECT 12, '按租赁物所属类别分类', ' 通用机械设备', 'general' FROM DUAL UNION ALL
SELECT 13, '按租赁物所属类别分类', ' 工程机械设备', 'engineering' FROM DUAL UNION ALL
SELECT 14, '按租赁物所属类别分类', ' 农林机械设备', 'agriculture' FROM DUAL UNION ALL
SELECT 15, '按租赁物所属类别分类', ' 工业装备', 'industry' FROM DUAL UNION ALL
SELECT 16, '按租赁物所属类别分类', '基础设施及不动产', 'empty' FROM DUAL UNION ALL
SELECT 17, '按租赁物所属类别分类', ' 其中,房屋', 'empty' FROM DUAL UNION ALL
SELECT 18, '按租赁物所属类别分类', ' 构筑物', 'empty' FROM DUAL UNION ALL
SELECT 19, '按租赁物所属类别分类', ' 其中,道路', 'empty' FROM DUAL UNION ALL
SELECT 20, '按租赁物所属类别分类', ' 管道(市政管道、水利管道)', 'empty' FROM DUAL UNION ALL
SELECT 21, '按租赁物所属类别分类', ' 桥梁、隧道', 'empty' FROM DUAL UNION ALL
SELECT 22, '按租赁物所属类别分类', ' 坝、堰、水道、沟、洞', 'empty' FROM DUAL UNION ALL
SELECT 23, '按租赁物所属类别分类', ' 码头、台、站', 'empty' FROM DUAL UNION ALL
SELECT 24, '按租赁物所属类别分类', '在建工程(设备类)', 'empty' FROM DUAL UNION ALL
SELECT 25, '按租赁物所属类别分类', '在建工程(非设备类)', 'empty' FROM DUAL UNION ALL
SELECT 26, '按租赁物所属类别分类', '无形资产', 'intangible' FROM DUAL UNION ALL
SELECT 27, '按租赁物所属类别分类', '生物资产', 'biological' FROM DUAL UNION ALL
SELECT 28, '按租赁物所属类别分类', '其他资产', 'empty' FROM DUAL
),
用不可见字符来保持缩进
FROM DUAL UNION ALL 是 Oracle 特有的写法,专门用来在 SQL 中手工构造一个固定的多行数据集(即"行值构造函数")。
拆开来看,它的含义和用法如下:
1. DUAL 是什么?
DUAL 是 Oracle 中一个系统自带的虚拟表,只有一行一列。
它的作用就是让你在不需要查询任何真实表时,也能执行 SELECT 语句,比如计算 SELECT 1+2 FROM DUAL。
2. UNION ALL 是什么?
UNION ALL 是集合操作符,用来把多个 SELECT 语句的查询结果纵向拼接在一起(保留所有行,不去重)。
3. 合在一起是什么意思?
SELECT ... FROM DUAL UNION ALL SELECT ... FROM DUAL 就相当于:
逐行生成一张固定的临时"维度表"
例如:
sql
复制代码
SELECT 1 AS sort_id, '正常' AS label FROM DUAL
UNION ALL
SELECT 2, '关注' FROM DUAL
UNION ALL
SELECT 3, '次级' FROM DUAL
实际返回的数据就是:
sort_id
label
1
正常
2
关注
3
次级
为什么在永洪报表中大量使用这种写法?
您在之前的脚本中看到的 WITH dims AS (SELECT 1 ... FROM DUAL UNION ALL SELECT 2 ... ),其核心目的是:
如果没有这种写法,当 base 表查询结果为 0 行时,整个 UNION ALL 结果会为空,报表就会一片空白。而使用 DUAL 构造的固定行,再配合 LEFT JOIN,即使无数据,金额列返回 NULL,行标签依然存在,满足您之前"维度列即使没有值也要完整显示"的需求。
注:这种写法是 Oracle 专属 的,因为 DUAL 是 Oracle 系统表。如果您在永洪上连接的是其他数据库(如 MySQL、SQL Server),需要用对应的写法(比如 SELECT 1 AS id UNION ALL SELECT 2,不加 FROM DUAL)。但鉴于您所有的表都是 jbfsbb.rp_*,且之前一直运行正常,说明您的数据源就是 Oracle,可以放心使用。