sql - 如何计算同一个表的多个列中的值
问题描述
我正在尝试构建一个 SQL 语句,该语句从位于同一个表中的多个列中返回唯一的非空值。
我尝试使用“sum”和“case”来制作这个 SQL 语句,就像在另一个 stackOverflow 主题中所说的那样,但它没有用。
我也试过这个:
Select count(distinct SYMPTOM_I, SYMPTOM_II, SYMPTOM_III, SYMPTOM_IV)
from DIAGNOSTIC_MEDVIR;
Create table DIAGNOSTIC_MEDVIR(
NIP varchar(32) not null,
DIAGNOSTIC_TIME int not null,
DAY_TIME varchar(32) not null,
SEX varchar(8) not null,
AGE int not null,
SYMPTOM_I varchar(64) not null,
SYMPTOM_II varchar(64),
SYMPTOM_III varchar(64),
SYMPTOM_IV varchar(64),
PATHOLOGY_I varchar(64) not null,
PATHOLOGY_II varchar(64),
PATHOLOGY_III varchar(64),
Constraint NIP_PK primary key(NIP),
Constraint CK_SEX check (SEX='Male' or SEX='Female'),
Constraint CK_DAYTIME(DAY_TIME='Morning' or DAY_TIME='Evening' or
DAY_TIME='Night')
);
假设我进入了这张表:
Insert into DIAGNOSTIC_MEDVIR
values ('195889419', 60, 'Morning', 'Male', 68, 'fever',
'sore throat', 'headache', , 'throat infection', , );
Insert into DIAGNOSTIC_MEDVIR
values ('195889420', 67, 'Morning', 'Female', 38, 'fever',
'headache', , , 'cold', , );
我想拥有:
fever: 2
sore throat: 1
headache: 1
解决方案
这种设计是有问题的,证据就是解决方案本身。
如果您决定添加具有第 5 个症状的另一列怎么办?
您必须更改所有内容,所有返回信息的查询,例如这个问题。
无论如何,在这种情况下,您需要分别获取每个 SYMPTOM_X 列的结果并使用 UNION 将它们组合起来。然后分组得到总结果:
select t.symptom, count(*) counter from (
select SYMPTOM_I symptom from DIAGNOSTIC_MEDVIR
union all
select SYMPTOM_II from DIAGNOSTIC_MEDVIR
union all
select SYMPTOM_III from DIAGNOSTIC_MEDVIR
union all
select SYMPTOM_IV from DIAGNOSTIC_MEDVIR
) t
where t.symptom is not null
group by t.symptom
请参阅演示。
结果:
> symptom | counter
> :---------- | ------:
> fever | 2
> headache | 2
> sore throat | 1
推荐阅读
- nuxt.js - 在 nuxtjs 中更新生成的页面
- javascript - 如何在javascript中遍历可能的空值而不会出错
- flutter - 我的 apk 重 150 mb,有什么办法可以减少这个吗?
- python - 如何将新节点添加到 XML 树中,从 Python 中的列表中读取?
- java - 如何使用 QueryParser 进行 Lucene 范围查询(IntPoint/LongPoint)
- python - (python) 使用 csv 文件存储地图的详细信息
- vim - 如何为使用 :registers 命令打开的缓冲区创建自动命令
- c# - .Net Core 3.1 - 无法跟踪实体类型“城市”的实例 - 使用自定义日期跟踪器时
- reactjs - 如何在反应中仅延迟加载一次
- azure-devops - Azure DevOps 服务器(本地)上传符号 (401) 未经授权