clinic_screenresult表中有三个字段,分别为taskid,modulename,sendtime。1.若taskid相同时,算作一个数据2.当taskid相同时且modulename为空时算为适宜处方数3.当taskid相同时,modulename数据不同,则根据modulename值分别计算数据4.modulename值分别有:体外配伍、单次剂量、给药频次、每日剂量、相互作用、配伍浓度、儿童用药5.分别计算modulename中各个值所占总数的比率,并用SQL表达
时间: 2024-03-06 12:47:39 浏览: 72
可以使用以下 SQL 语句来实现上述需求:
```
SELECT
taskid,
CASE
WHEN COUNT(DISTINCT modulename) = 1 AND MAX(modulename) IS NULL THEN '适宜处方数'
ELSE modulename
END AS modulename,
COUNT(*) AS count,
COUNT(*) / SUM(COUNT(*)) OVER (PARTITION BY taskid) AS ratio
FROM
clinic_screenresult
GROUP BY
taskid,
CASE
WHEN COUNT(DISTINCT modulename) = 1 AND MAX(modulename) IS NULL THEN '适宜处方数'
ELSE modulename
END
ORDER BY
taskid,
CASE
WHEN COUNT(DISTINCT modulename) = 1 AND MAX(modulename) IS NULL THEN 0
ELSE 1
END,
modulename
```
解释:
1. `CASE` 语句用于将 `modulename` 字段为空的记录转换为字符串 "适宜处方数"。
2. 使用 `GROUP BY` 语句将记录按照 `taskid` 和 `modulename` 进行分组。
3. 使用 `COUNT(*)` 函数统计每个分组中的记录数。
4. 使用窗口函数 `SUM(COUNT(*)) OVER (PARTITION BY taskid)` 计算每个 `taskid` 分组中的总记录数。
5. 使用 `/` 运算符计算比率。
6. 使用 `ORDER BY` 语句将结果按照 `taskid`、是否为适宜处方数、`modulename` 字符串的顺序进行排序。
阅读全文