Как вернуть счетчик (*) 0 вместо NULL - PullRequest
4 голосов
/ 07 ноября 2011

У меня есть этот бит кода:

SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year

, где он не возвращает никаких строк, когда счетчик равен нулю. Как сделать так, чтобы эти строки отображались с HighRiskCount, установленным в 0?

Ответы [ 7 ]

9 голосов
/ 07 ноября 2011

Вы не можете выбрать значения из таблицы, когда количество строк равно 0. Где бы оно получило значения для несуществующих строк?

Для этого вам понадобится еще одна таблица, которая определяет ваш список допустимых значений Project и Financial_Year. Затем вы выберите из этой таблицы, выполните left join на существующей таблице, а затем выполните группировку.

Примерно так:

SELECT l.Project, l.Financial_Year, COUNT(t.Project) AS HighRiskCount
INTO #HighRisk 
FROM MasterRiskList l
left join #TempRisk1 t on t.Project = l.Project and t.Financial_Year = l.Financial_Year
WHERE t.Risk_1 = 3
GROUP BY l.Project, l.Financial_Year
4 голосов
/ 28 февраля 2016

Оберните ваш SELECT запрос в ISNULL:

SELECT ISNULL((SELECT Project, Financial_Year, COUNT(*) AS hrc
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year),0) AS HighRiskCount

Если ваш SELECT вернет число, оно пройдет. Если он вернет NULL, то 0 пройдет.

2 голосов
/ 07 ноября 2011

Предполагая, что у вас есть «Project» и «Financial_Year», где Risk_1 отличается от 3, и это те, которые вы намереваетесь включить.

Кстати, ваш текущий запрос не возвращает ноль, он не возвращает ни одной строки.

1 голос
/ 07 ноября 2011

Использование:

   SELECT x.Project, x.financial_Year, 
          COUNT(y.*) AS HighRiskCount
     INTO #HighRisk 
     FROM (SELECT DISTINCT t.project, t.financial_year
             FROM #TempRisk1
            WHERE t.Risk_1 = 3) x
LEFT JOIN #TempRisk1 y ON y.project = x.project
                      AND y.financial_year = x.financial_year
 GROUP BY x.Project, x.Financial_Year

Единственный способ получить нулевые значения - это использовать OUTER соединение со списком различных значений, для которых вы хотите увидеть нулевые значения.

0 голосов
/ 07 ноября 2011

Немного дольше, но как насчет этого решения?

IF EXISTS (
        SELECT *
        FROM #TempRisk1
        WHERE Risk_1 = 3
    )
    BEGIN
        SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount
        INTO #HighRisk 
        FROM #TempRisk1
        WHERE Risk_1 = 3
        GROUP BY Project, Financial_Year
    END
ELSE
    BEGIN
        INSERT INTO #HighRisk 
            SELECT 'Project', 'Financial_Year', 0
    END
0 голосов
/ 07 ноября 2011

SQL обычно имеет проблему с возвратом значений, которые не в таблице.Для этого (в любом случае без хранимой процедуры) вам понадобится еще одна таблица, содержащая пропущенные значения.

Предполагая, что вы хотите одну строку для комбинации проекта / финансового года, вам понадобится таблицакоторый содержит каждую действительную комбинацию Project, Finanical_Year:

 SELECT HR.Project, HR.Financial_Year, COUNT(HR.Risk_1) AS HighRiskCount
 INTO #HighRisk HR RIGHT OUTER JOIN ProjectYears PY
   ON HR.Project = PY.Project AND HR.Financial_Year = PY.Financial_Year
 FROM #TempRisk1
 WHERE Risk_1 = 3
 GROUP BY HR.Project, HR.Financial_Year

Обратите внимание, что мы пользуемся тем фактом, что COUNT () будет считать только ненулевые значения, чтобы получить результат 0 COUNT для этих записей набора результатовкоторые состоят только из данных из новой таблицы ProjectYears.

В качестве альтернативы вы можете вернуть только одну запись с 0 счетами на проект (или, может быть, одну на financial_year).Вы должны изменить приведенное выше решение так, чтобы таблица JOINed содержала только один столбец.

0 голосов
/ 07 ноября 2011

MSDN - функция ISNULL

<code>
SELECT Project, Financial_Year, ISNULL(COUNT(*), 0) AS HighRiskCount
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year
...