背景
源数据格式
地区 | 疾病类型 | 数量 |
北部 | A类疾病 | 10 |
北部 | B类疾病 | 20 |
北部 | C类疾病 | 10 |
需要转换的数据格式
地区 | 就诊数量 |
北部 | A类疾病:10,B类疾病:20,C类疾病:10 |
方法一:MySQL
我们首先来到MySQL,遇到了一个有趣的数据集。数据包含地区、疾病类型和数量信息。我们的目标是将数据转换为指定的格式,让每个地区对应一个字符串,其中包含各个疾病类型和对应数量的信息。
我使用了动态SQL,通过GROUP_CONCAT
和CONCAT
函数,生成了适当的查询语句。这样,我们可以动态地生成需要的字段,无论疾病类型的数据条数有多少,都能应对自如。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN 疾病类型 = ''',
疾病类型,
''' THEN 数量 ELSE 0 END) AS `',
疾病类型,
'`'
)
) INTO @sql
FROM 原始表;
SET @sql = CONCAT('SELECT 地区, ', @sql, ' FROM 原始表 GROUP BY 地区');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
方法二:达梦数据库
接着,我们来到达梦数据库,面对着同样的数据处理需求。我们希望利用LISTAGG
函数,将数据转换成指定格式。幸运的是,达梦数据库也支持常用的SQL函数和语法,所以解决方案与MySQL类似。
SELECT
地区,
LISTAGG(疾病类型 || ':' || 数量, ',') WITHIN GROUP (ORDER BY 疾病类型) AS 就诊数量
FROM
原始表
GROUP BY 地区;
在达梦数据库中,我们依然成功实现了数据格式的转换。LISTAGG
函数将疾病类型和数量连接成字符串,用冒号分隔,然后用逗号分隔不同的疾病类型。