T-SQL Количество строк с конкретными значениями (несколько в одном запросе) - PullRequest
43 голосов
/ 07 июля 2010

Мне нужна помощь с запросом T-SQL.Я хочу подсчитать поля, которые имеют специальное значение (например,> 1).

Предполагается, что у меня есть таблица типа:

IGrp | Item | Value1 | Value2
#############################
A    | I11  | 0.52   | 1.18
A    | I12  | 1.30   | 0.54
A    | I21  | 0.49   | 2.37
B    | I22  | 2.16   | 1.12
B    | I31  | 1.50   | 0.28

Мне нужен результат, подобный:

IGrp | V1High | V2High 
######################
A    | 1      | 2
B    | 2      | 1

По-моему, это должно происходить с этим выражением

SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High
FROM Tbl GROUP BY IGrp

Но это невозможно в T-SQL, поскольку Count () не принимает логические значения.Так действительно ли это единственный возможный способ сделать несколько запросов с WHERE Value>1 и COUNT(*) и присоединиться к ним впоследствии?Или есть хитрость для достижения желаемого результата?

Заранее спасибо.

Ответы [ 5 ]

68 голосов
/ 07 июля 2010
SELECT IGrp, 
    COUNT(CASE WHEN Value1 > 1 THEN 1 ELSE NULL END) AS V1High, 
    COUNT(CASE WHEN Value2 > 1 THEN 1 ELSE NULL END) AS V2High 
FROM Tbl
GROUP BY IGrp
10 голосов
/ 07 июля 2010

Вы можете использовать оператор CASE:

SELECT IGrp, 
    SUM(CASE WHEN Value1>1 THEN 1 ELSE 0 END) AS V1High, 
    SUM(CASE WHEN Value2>1 THEN 1 ELSE 0 END) AS V2High 
FROM Tbl GROUP BY IGrp 
3 голосов
/ 07 июля 2010

используйте case when сделает работу за вас

SELECT IGrp, 
 sum(case when isnull(Value1,0)>1 then 1 else 0 end) AS V1High, 
 sum(case when isnull(Value2,0)>1 then 1 else 0 end) AS V2High 
FROM Tbl GROUP BY IGrp 
2 голосов
/ 02 марта 2013
SELECT IGrp, 
    COUNT(CASE WHEN Value1 = 'Foo' THEN 1 ELSE NULL END) AS Tot_Foo, 
    COUNT(CASE WHEN Value1 = 'Blah' THEN 1 ELSE NULL END) AS Tot_Blah 
FROM Tbl
GROUP BY IGrp

Это также можно использовать для сравнения 2 разных значений для одного и того же поля с незначительными изменениями, как показано выше.

Очень полезно для проверки значений, которые должны существовать в соотношении 1: 1.

0 голосов
/ 07 июля 2010

Вы можете поместить оператор CASE .. WHEN .. в функции COUNT (), чтобы возвращать 1 при выполнении условий, в противном случае NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...