我正在尝试构造一条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
答案 0 :(得分:1)
此设计有问题,证明本身就是解决方案。
如果您决定添加另一列具有第五种症状的列怎么办?
您将必须更改所有内容,所有返回信息的查询(例如此问题)。
无论如何,在这种情况下,您需要分别获取每个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
请参见demo。
结果:
> symptom | counter
> :---------- | ------:
> fever | 2
> headache | 2
> sore throat | 1