表结构是 患者ID, 访视名,访问时间,这是一个横表,现在需要转化为ID为主键,多列情况
时间: 2024-03-17 17:45:41 浏览: 20
在 MySQL 中,可以使用 GROUP_CONCAT 函数和动态 SQL 将横表数据转换为多列数据。以下是一个示例:
假设我们有一个名为 Visits 的表,其中包含如下数据:
```
PatientID VisitName VisitDate
1 Visit 1 2021-01-01
1 Visit 2 2021-02-01
1 Visit 3 2021-03-01
2 Visit 1 2021-01-01
2 Visit 2 2021-02-01
2 Visit 3 2021-03-01
```
现在我们想将每个患者的每个访视名和访问时间转换为一列。由于列数不固定,我们需要使用 GROUP_CONCAT 函数和动态 SQL 来构建查询语句。以下是一个示例:
```
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN VisitName = ''',
VisitName,
''' THEN VisitDate ELSE NULL END) AS `',
VisitName, '`'
)
) INTO @sql
FROM
Visits;
SET @sql = CONCAT('SELECT PatientID, ', @sql, '
FROM Visits
GROUP BY PatientID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```
在这个查询中,我们首先使用 GROUP_CONCAT 函数和 CONCAT 函数将每个访视名转换为一个 MAX(CASE...) 语句,每个 MAX(CASE...) 语句对应一个访视名的访问时间。接下来,我们将这些 MAX(CASE...) 语句合并为一个 SELECT 语句,并使用 PREPARE 函数和 EXECUTE 函数执行查询。
注意,在使用动态 SQL 时需要注意 SQL 注入攻击的风险。为了避免 SQL 注入攻击,应该对输入参数进行严格的校验和过滤。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)