基本上我想得到两个计数。第一个计数是记录数。第二个计数是包含数据的记录数。这两个计数来自名为调查的表,其中没有所有的州名。所以我将其与其他表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
一些相关的子查询可以帮助您。它们看起来像是内联选择,但使用对内联查询之外的表的引用。像这样:
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
这可能会更加优化,但我不熟悉您的数据,或者清楚您要使用原始查询完成什么。
评论太久了。
您获得的语法错误是因为您的内联子查询格式不正确。你不能从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;
这里有一个次要问题,即这个查询是否会完成你期望它做的事情。对于Larnu在评论中的观点,聚合函数在不同情况下处理NULL
的方式不同。但是如果没有要测试的样本数据,我无法判断这个功能版本的查询是否会返回您想要的内容。