Динамически установить результат запроса TSQL, используя CASE WHEN - PullRequest
1 голос
/ 27 мая 2010
SELECT  MyTable.Name,
        (
          SELECT CASE WHEN ISNULL(SUM(TotalDays), 0) <= 0 THEN 0 
                      ELSE SUM(TotalDays) 
          END AS Total
          FROM    Application AS Applications
          WHERE   (ID = MyTable.id)
        ) - MIN(Assignments) AS Excesses
FROM    MyTable

Приведенный выше оператор TSQL является подзапросом в основном запросе. Когда я запускаю его, если TotalDays равно NULL или <= 0, тогда Total устанавливается в 0 (ноль). </p>

То, что я хотел бы сделать здесь, это установить результат всего запроса (Превышения) в 0. Я хочу (Превышения) , который является результатом Всего - Мин (Назначения) устанавливается в 0, если его значение равно NULL или <= 0. </p>

Я хочу, чтобы CASE WHEN применялся ко всему запросу, но я изо всех сил пытаюсь сделать это правильно.

Ответы [ 2 ]

1 голос
/ 27 мая 2010
SELECT
  MyTable.Name,
  CASE WHEN
    0 < (SELECT SUM(TotalDays) FROM Application WHERE ID = MyTable.id) - MIN(Assignments)
  THEN
    (SELECT SUM(TotalDays) FROM Application WHERE ID = MyTable.id) - MIN(Assignments)
  ELSE
    0
  END AS [Excesses]
FROM
  MyTable

Примечание: MS SQL Server не будет независимо выполнять два коррелированных подзапроса, он будет фактически распознавать, что они совпадают, и повторно использовать результаты.

Альтернатива:

SELECT
  MyTable.Name,
  CASE WHEN
    0 < SUM([application].TotalDays) - MIN([MyTable].Assignments)
  THEN
    SUM([application].TotalDays) - MIN([MyTable].Assignments)
  ELSE
    0 -- If either aggregate is NULL, 0 will still be returned
  END AS [Excesses]
FROM
  MyTable
LEFT JOIN
  Application
    ON [application].ID = [MyTable].id
0 голосов
/ 27 мая 2010
SELECT  MyTable.Name, CASE WHEN ISNULL(SUM(TotalDays), 0) <= 0 THEN 0 ELSE SUM(TotalDays) END AS Total
FROM    Application AS Applications
JOIN    MyTable
ON      Applications.id = mytable.id
GROUP BY
        MyTable.id, MyTable.name
HAVING  CASE WHEN ISNULL(SUM(TotalDays), 0) <= 0 THEN 0 ELSE SUM(TotalDays) END > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...