如何解决如何选择填充多列的数据
我有一个名为 [SAMPLES] 的样本表,我已针对不同类型的实验室分析结果在末尾添加了多列,但是对于大多数样本,仅完成了一项分析。我希望能够仅选择对同一样本完成了多项分析的样本。
表结构类似于:
对于上述情况,查询应仅选择样本“ABC122”和“ABC123”。
有没有一种简单的方法来选择这些数据?
解决方法
您可以使用 cross apply
和 values
轻松地将您的列反旋转回它们应有的行,然后相应地进行计数和过滤
with x as (
select distinct sampleId,SampleType,Count(*) over(partition by sampleid,sampletype) qty
from samples s
cross apply(values (analysis1),(analysis2),(analysis3),(analysis4),(analysis5),(analysis6))v(analysis)
where analysis is not null
)
select s.*
from x join samples s on s.sampleid=x.sampleid and s.sampletype=x.sampletype
where x.qty>1
,
更好的数据库设计应该是:
samples table
-------------
sampleID
sampleType
analyses table
--------------
sampleID
analysisType
analysisResult
然后你可以像这样查询你想要的结果:
select sampleID
from analyses
group by sampleID
having count(analysisResult) >= 2
使用适当的索引,这将是非常快的。
,您可以使用 UNPIVOT 获取分析 > 1 的样本 ID,然后使用这些样本 ID 进行过滤。
--
DECLARE @sample table(sampleid char(30),sampletype char(10),analysis1 decimal(3,2),analysis2 decimal(3,analysis3 decimal(3,analysis4 decimal(3,2))
insert into @sample
values ('ABC121','ROCK',0.23,null,null),('ABC122',0.27,0.23),('ABC123',0.22,0.28),('ABC124',0.25,null)
;WITH CTE_Moresamples as
(
SELECT sampleid FROM @sample
unpivot
(
val for keyv in ([analysis1],[analysis2],[analysis3],[analysis4])
) as upvt
group by sampleid
having count(val) > 1
)
SELECT * FROM @sample as s
inner join CTE_Moresamples as c
on c.sampleid = s.sampleid
sampleid | 样本类型 | 分析1 | 分析2 | 分析3 | 分析4 |
---|---|---|---|---|---|
ABC122 | 摇滚 | 0.27 | NULL | NULL | 0.23 |
ABC123 | 摇滚 | 0.22 | NULL | NULL | 0.28 |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。