Ответ 1
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
Мне нужна помощь с запросом 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(*)
и присоединиться к ним впоследствии? Или есть трюк для достижения желаемого результата?
Спасибо заранее.
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
Вы можете использовать оператор 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
использовать 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
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
Это также можно использовать для сравнения двух разных значений для одного и того же поля с незначительными изменениями, как показано выше.
Очень полезно для проверки значений, которые должны существовать в соотношении 1:1.
Вы можете поместить оператор CASE.. WHEN.. внутри функций COUNT(), чтобы вернуть 1, когда условия сохранены, NULL в противном случае.