【问题标题】:Count unique IDs with Case使用 Case 计算唯一 ID
【发布时间】:2014-01-30 14:09:08
【问题描述】:

我有这个查询(使用 SQL Server 2008):

SELECT  
    ISNULL(tt.strType,'Random'), 
    COUNT(DISTINCT t.intTestID) as Qt_Tests,    
    COUNT(CASE WHEN sd.intResult=4 THEN 1 ELSE NULL END) as Positives
FROM TB_Test t 
LEFT JOIN TB_Sample s ON t.intTestID=s.intTestID 
LEFT JOIN TB_Sample_Drug sd ON s.intSampleID=sd.intSampleID
LEFT JOIN TB_Employee e ON t.intEmployeeID=e.intEmployeeID
LEFT JOIN TB_Test_Type tt ON t.intTestTypeID=tt.intTestTypeID
WHERE 
    s.dtmCollection BETWEEN '2013-06-01 00:00' AND '2013-08-31 23:59'
    AND f.intCompanyID = 91
GROUP BY    
    tt.strType

问题是每个样本在 sample_drug 上都有四个记录,代表在该样本上测试的药物。并且样本的结果可以同时从一到四种药物中呈阳性。 我需要在第三栏中显示的是样本是否为阳性,无论有多少药物。 而且我找不到这样做的方法,因为我需要 CASE WHEN 知道我想要所有的 Results = 4 但只是来自唯一的 intSampleID。

提前致谢!

【问题讨论】:

    标签: sql-server unique case-when


    【解决方案1】:

    如果我理解正确,最简单的方法是使用max() 而不是count()

    SELECT ISNULL(tt.strType,'Random'), 
           COUNT(DISTINCT t.intTestID) as Qt_Tests,    
           max(CASE WHEN sd.intResult = 4 THEN 1 ELSE NULL END) as HasPositives
    . . . 
    

    编辑:

    如果您想要获得阳性结果的样本数,请使用 count(distinct)case 语句。

    SELECT ISNULL(tt.strType,'Random'), 
           COUNT(DISTINCT t.intTestID) as Qt_Tests,    
           count(distinct CASE WHEN sd.intResult = 4 THEN s.intSampleID end) as NumPositiveSamples
    

    【讨论】:

    • 使用 MAX() 它只显示每种测试类型的 1 个阳性,无论它们有多少阳性。
    • @user3253448 。 . .我的编辑版本是你要找的吗?
    • 朋友,我欠你很多。你完全搞定了。非常感谢!
    【解决方案2】:

    而不是这个:

    COUNT(CASE WHEN sd.intResult=4 THEN 1 ELSE NULL END) as Positives
    

    试试这个:

    SUM(CASE WHEN sd.intResult=4 THEN 1 ELSE 0 END) as Positives
    

    【讨论】:

    • 已经试过了,0 不起作用,因为它是一个对象,所以它就像 1 一样被计数。无论如何谢谢:)
    • 您是否也尝试将 COUNT 更改为 SUM ??
    • 是的,一点变化都没有。
    【解决方案3】:

    如果我没有正确理解您想要在肯定列中显示 TB_Sample_Drug 中标有 intResult = 4 (1) 或不 (null) 的行,则应该可以工作。

        SELECT  
            ISNULL(tt.strType,'Random'), 
            COUNT(DISTINCT t.intTestID) as Qt_Tests,    
            CASE WHEN sd.Positives > 0 THEN 1 ELSE NULL END as Positives
        FROM TB_Test t 
        LEFT JOIN TB_Sample s ON t.intTestID=s.intTestID 
        LEFT JOIN TB_Employee e ON t.intEmployeeID=e.intEmployeeID
        LEFT JOIN TB_Test_Type tt ON t.intTestTypeID=tt.intTestTypeID
        CROSS APPLY (select count(*) as Positives from TB_Sample_Drug sd where s.intSampleID=sd.intSampleID and sd.intResult=4) sd 
        WHERE 
            s.dtmCollection BETWEEN '2013-06-01 00:00' AND '2013-08-31 23:59'
            AND f.intCompanyID = 91
        GROUP BY    
            tt.strType
    

    【讨论】:

    • 其实intResult是TB_Sample_Drug的一列,值为4时表示该特定药物为阳性。您的查询给出了一个奇怪的结果,显示多次相同类型的测试有很多不同的数量。
    猜你喜欢
    • 2011-03-29
    • 2011-03-17
    • 1970-01-01
    • 2019-05-05
    • 2011-12-17
    • 2013-07-05
    • 2011-09-13
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多