2014-01-30 4 views
1

У меня есть этот запрос (с помощью SQL Server 2008):граф уникальные идентификаторы с Case

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 
. . . 

EDIT:

Если вы хотите, количество образцов с положительным результатом, а затем использовать 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

@ пользователь3253448. , , Является ли моя отредактированная версия тем, что вы ищете? –

+0

Мой друг, я вам задолжаю. Ты полностью прибил его. Спасибо огромное! – Lightspeed

0

вместо этого:

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

Уже попробовали это, то 0 не работает, как это объект, поэтому он получает подсчитываются так же, как 1. Спасибо в любом случае :) – Lightspeed

+0

вы также попытаться изменить COUNT просуммировать ?? – BWS

+0

Да, немного не меняется. – Lightspeed

0

Должно работать, если я undestood правильно, что вы хотите показать, что строка в 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 
+0

Фактически intResult является столбцом TB_Sample_Drug, а когда значение равно 4, это означает, что этот конкретный препарат положительный. Ваш запрос дал нечетный результат, показывающий несколько раз тот же тип теста с большим количеством разных величин. – Lightspeed

Смежные вопросы