【问题标题】:How to select data where more than one column is populated如何选择填充多列的数据
【发布时间】:2026-01-11 02:00:01
【问题描述】:

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

表结构类似于:

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

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

  • SQL 2012 数据库。

【问题讨论】:

  • 你的桌子设计真的很糟糕。你愿意接受改变吗?
  • 嗨 Juergen,分析类型在它们自己的列中,结果在单独的列中,所以我实际上将它们转为每个样本,而不是每个样本有多行。但是是的,绝对愿意改变
  • For the above, the query should select only samples 'ABC120' and 'ABC121'. 我猜你的意思是ABC122ABC123

标签: sql sql-server-2012


【解决方案1】:

您可以使用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

【讨论】:

  • 谢谢斯图。由于有最后期限,我最终使用了一些 case when 语句来解决我最初的问题,但以上内容非常有帮助。
【解决方案2】:

更好的数据库设计应该是:

samples table
-------------
sampleID
sampleType


analyses table
--------------
sampleID
analysisType
analysisResult

然后你可以像这样查询你想要的结果:

select sampleID
from analyses
group by sampleID
having count(analysisResult) >= 2

使用适当的索引,这将非常快。

【讨论】:

    【解决方案3】:

    您可以通过 UNPIVOT 获取具有分析 > 1 的 sampleid。然后使用这些 sampleid 进行过滤。

    --
    DECLARE @sample table(sampleid char(30), sampletype char(10), analysis1 decimal(3,2),analysis2 decimal(3,2), analysis3 decimal(3,2), analysis4 decimal(3,2))
    
    insert into @sample
    values ('ABC121','ROCK',0.23,null,null,null),('ABC122','ROCK',0.27,null,null,0.23),('ABC123','ROCK',0.22,null,null,0.28),
    ('ABC124','ROCK',null,null,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 sampletype analysis1 analysis2 analysis3 analysis4
    ABC122 ROCK 0.27 NULL NULL 0.23
    ABC123 ROCK 0.22 NULL NULL 0.28

    【讨论】: