微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何选择填充多列的数据

如何解决如何选择填充多列的数据

我有一个名为 [SAMPLES] 的样本表,我已针对不同类型的实验室分析结果在末尾添加了多列,但是对于大多数样本,仅完成了一项分析。我希望能够仅选择对同一样本完成了多项分析的样本。

表结构类似于:

enter image description here

对于上述情况,查询应仅选择样本“ABC122”和“ABC123”。

有没有一种简单的方法来选择这些数据?

解决方法

您可以使用 cross applyvalues 轻松地将您的列反旋转回它们应有的行,然后相应地进行计数和过滤

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 举报,一经查实,本站将立刻删除。