SQL Server ISNULL несколько столбцов - PullRequest
0 голосов
/ 06 октября 2019

У меня есть следующий запрос, который прекрасно работает, но как мне добавить несколько столбцов в его операторе select? Ниже приведен запрос:

SELECT ISNULL(
(SELECT DISTINCT a.DatasourceID
FROM [Table1] a
WHERE a.DatasourceID = 5 AND a.AgencyID = 4 AND a.AccountingMonth = 201907), NULL) TEST

В настоящее время я получаю только один столбец (TEST), но хотел бы добавить другие столбцы, такие как DataSourceID, AgencyID и AccountingMonth.

Ответы [ 3 ]

0 голосов
/ 06 октября 2019

способ, которым вы делаете, позволяет только один столбец и одну запись и дает ему имя теста. Это не похоже, что вы действительно должны проверить на ноль. потому что вы возвращаете ноль, так что ничто не поможет вам. Удалите все нулевое тестирование и верните полный набор записей, что также ограничит ваши возвраты до 1 записи. При работе с одной таблицей вам не нужен псевдоним, если нет пробелов или ключевые слова в скобках, идентификаторы не требуются. если вам нужно проверить, есть ли у вас пустой набор записей, проверьте его в вызывающей программе.

SELECT  DatasourceID, AgencyID,AccountingMonth
FROM Table1 
WHERE DatasourceID = 5 AND AgencyID = 4 AND AccountingMonth = 201907
0 голосов
/ 07 октября 2019

Если вы хотите вывести строку для некоторого условия (или запрошенных значений) и вывести строку, если она не удовлетворяет условию, вы можете установить псевдотаблицу для запрошенных вами значений в предложении FROM и выполнить внешнее левое соединение с помощьюваш Table1.

SELECT ISNULL(Table1.DatasourceId, 999999), 
       Table1.AgencyId,
       Table1.AccountingMonth, 
       COUNT(*) as count
FROM ( VALUES (5, 4, 201907 ),
              (6, 4, 201907 ))
       AS requested(DatasourceId, AgencyId, AccountingMonth)
LEFT OUTER JOIN Table1 ON requested.agencyid=Table1.AgencyId
        AND requested.datasourceid = Table1.DatasourceId
        AND requested.AccountingMonth = Table1.AccountingMonth
GROUP BY Table1.DatasourceId, Table1.AgencyId, Table1.AccountingMonth

Обратите внимание, что:

  • Я поставил ISNULL для первого столбца, как вы сделали, чтобы вывести определенное значение (9999), когда нет значениянайден.
  • Я не поместил ISNULL (..., NULL), как ваш запрос, в другие столбцы, так как ИМХО это не нужно: если значения нет, в любом случае будет выведен ноль.
  • Я добавил столбец COUNT (*), чтобы проиллюстрировать агрегат, вы можете использовать другой (SUM, MIN, MAX) или ничего, если он вам не нужен.
  • Набор запрашиваемых значений:в виде константных значений таблицы (см. https://docs.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?view=sql-server-2017)
    Я добавил несколько строк для запрошенных условий: вы можете запросить несколько источников данных, агентства или месяцы в одном запросе с одной строкой для каждого в выходных данных.
    Если выхочу толькоодна строка, поместите только одну строку в «запрошенные» значения псевдотаблицы.
  • Должен быть параметр GROUP BY, даже если вы не хотите использовать агрегат (число, сумму или другое), чтобы иметьтакое же поведение, как и у вашего отдельного предложения, оно ограничивает вывод одной строкой для запрошенных значений.
0 голосов
/ 06 октября 2019

Мне кажется, что вы хотите узнать, существуют ли данные, я полагаю, что ваш AgentID является внешним ключом для таблицы агентства, DataSourceID также для DataSource, и что у вас есть таблица AccountingMonth, в которой есть все учетные периоды:

    SELECT ds.ID as DataSourceID , ag.ID as AgencyID ,  am.ID as AccountingMonth , 
 ISNULL(COUNT(a.*),0) as Count
    FROM [Table1] a
    RIGHT JOIN [Datasource] ds ON ds.ID = a.DataSourceID
    RIGHT JOIN [Agency] ag ON ag.ID = a.AgencyID
    RIGHT JOIN [AccountingMonth] am on am.ID = a.AccountingMonth 
    GROUP BY ds.ID, ag.ID,  am.ID

Таким образом, вы можете увидеть количество записей на группу по критериям. Обратите внимание, что RIGHT join, вы должны использовать RIGHT JOIN, если вы хотите включить все записи из таблицы "Right".

В вашем запросе у вас есть DISTINCT a.DatasourceID и WHERE a.DatasourceID = 5, и он возвращает 5, если вТаблица существует строк, которые соответствуют вашим критериям WHERE, и возвращает ноль, если нет данных. Если вы удалите WHERE a.DatasourceID = 5, ваш запрос будет прерван с ошибкой: подзапрос вернул несколько строк.

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