2014-01-30 57 views
1

我有这样的查询(使用SQL Server 2008):计数唯一的ID与案例

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来知道我想要所有的结果= 4,但仅仅来自独特的intSampleID。

在此先感谢!

回答

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 
+0

使用MAX(),每种类型的测试只显示1个正数,不管他们有多少正数。 – Lightspeed

+0

@ user3253448。 。 。我的编辑版本是你在找什么? –

+0

我的朋友,我欠你很多。你完全钉了它。非常感谢! – Lightspeed

0

,而不是这样的:

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

试试这个:如果我undestood正确的,你想表明,在TB_Sample_Drug一排标有

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

已具备试了一下,0不起作用,因为它是一个对象,所以它被计算就像1.不管怎样,谢谢:) – Lightspeed

+0

你也尝试改变COUNT总结? – BWS

+0

是的,不会改变一点。 – Lightspeed

0

应工作intResult = 4(1)或不(空)在肯定列。

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 
+0

实际上,intResult是TB_Sample_Drug的一列,当值为4时,表示该特定药物是阳性的。您的查询给出了一个奇怪的结果,显示了多次相同类型的测试,并有许多不同的数量。 – Lightspeed