Есть ли способ выбрать два счета с разными подзапросами в одном синтаксисе? - PullRequest
0 голосов
/ 11 апреля 2019

В основном я хочу получить два счета.Первый счетчик - это количество записей.Второй счетчик - это количество записей с данными.Эти две цифры взяты из таблицы под названием «расследование», которая не имеет всего названия штата.Поэтому я соединяю его с другой таблицей UsState, чтобы получить все имена состояний.Я собрал синтаксис, но получаю ошибку.

SELECT
Name as State,
count (*)from NamrsFrozen2017.Investigation2017 where FiscalYear = 2017 AND StateName in (SELECT distinct StateName FROM [NamrsFrozen2017].[Investigation2017] WHERE (not ReportDate = '' ))[Report Date Records],
count (*) from NamrsFrozen2017.Investigation2017 WHERE FiscalYear = 2017 AND ReportDate != '' AND StateName in (SELECT distinct StateName FROM [NamrsFrozen2017].[Investigation2017] WHERE (not ReportDate = '' ))[Report Date Records with Data]
From
(SELECT DISTINCT Name FROM NamrsFullDw.UsState) s
LEFT JOIN NamrsFrozen2017.Investigation2017 c ON s.Name = c.StateName AND  c.FiscalYear = 2017
  GROUP BY Name
  Order by Name

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Слишком долго для комментария.

Синтаксическая ошибка, которую вы получаете, заключается в том, что ваши встроенные подзапросы отформатированы неправильно.Вы не можете начать с функции COUNT(*);каждый из них должен быть полностью сформирован SELECT заявления.Затем каждый из них должен быть заключен в скобки.

Вот как должен выглядеть ваш запрос.

SELECT
  Name AS State
 ,(
    SELECT
      COUNT(*)
    FROM
      NamrsFrozen2017.Investigation2017
    WHERE
      FiscalYear = 2017
      AND StateName IN
          (
            SELECT DISTINCT StateName
            FROM NamrsFrozen2017.Investigation2017
            WHERE ReportDate <> ''
          )
  ) AS [Report Date Records]
 ,(
    SELECT
      COUNT(*)
    FROM
      NamrsFrozen2017.Investigation2017
    WHERE
      FiscalYear = 2017
      AND ReportDate != ''
      AND StateName IN
          (
            SELECT DISTINCT StateName
            FROM NamrsFrozen2017.Investigation2017
            WHERE (NOT ReportDate = '')
          )
  ) AS [Report Date Records with Data]
FROM
  (SELECT DISTINCT Name FROM NamrsFullDw.UsState) AS s
LEFT JOIN
  NamrsFrozen2017.Investigation2017 AS c
    ON
    s.Name = c.StateName
      AND c.FiscalYear = 2017
GROUP BY
  Name
ORDER BY
  Name;

Здесь есть дополнительный вопрос, который заключается в том, будет ли этот запрос выполнять то, что вы ожидаете.К замечанию Ларну в комментариях, агрегатные функции по-разному обрабатывают NULL в разных обстоятельствах.Но без образцов данных для сравнения я не могу сказать, будет ли эта функциональная версия запроса возвращать то, что вы хотите.

0 голосов
/ 11 апреля 2019

Некоторые коррелированные подзапросы помогут вам.Они выглядят как встроенные выборки, но используют ссылки на таблицы вне встроенного запроса.Например:

SELECT 
   Name as State,
   (SELECT COUNT(*) 
    FROM NamrsFrozen2017.Investigation2017 
    --I would think you want to view count of records for the current state, and not ALL states
    -- and not ALL states. So filter like this:
    WHERE FiscalYear = 2017 AND StateName = s.Name -- <-Correlated
    --Don't need a full list, like you had before
    -- (SELECT distinct StateName FROM [NamrsFrozen2017].[Investigation2017] WHERE (not ReportDate = '' ))
   ) AS [Report Date Records],
   (SELECT COUNT(*) 
    FROM NamrsFrozen2017.Investigation2017 
    WHERE FiscalYear = 2017 AND StateName = s.Name -- <- correlated
        AND ReportDate != '' --or maybe ReportDate IS NOT NULL            
    --Don't need to query the full table after correlating this to your FROM clause
    --  in (SELECT distinct StateName FROM [NamrsFrozen2017].[Investigation2017] WHERE (not ReportDate = '' ))
   ) AS [Report Date Records with Data]
FROM
   (SELECT DISTINCT Name FROM NamrsFullDw.UsState) s
   LEFT JOIN NamrsFrozen2017.Investigation2017 c 
        ON s.Name = c.StateName AND c.FiscalYear = 2017
GROUP BY s.Name
ORDER BY s.Name

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

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