首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在一个语法中选择两个具有不同子查询的计数?

有没有办法在一个语法中选择两个具有不同子查询的计数?
EN

Stack Overflow用户
提问于 2019-04-11 22:10:09
回答 2查看 28关注 0票数 0

基本上,我想得到两个计数。第一个计数是记录数。第二个计数是包含数据的记录数。这两个计数来自名为调查的表,该表并不包含所有州的名称。因此,我将它与另一个表UsState连接起来,以获得所有州的名称。我把语法放在一起,但我得到了一个错误。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-11 23:03:39

一些相关子查询会对您有所帮助。它们看起来像内联selects,但使用对内联查询外部的表的引用。如下所示:

代码语言:javascript
复制
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

这可能会优化得更多,但我不熟悉您的数据,也不清楚您到底想要用原始查询完成什么。

票数 0
EN

Stack Overflow用户

发布于 2019-04-11 23:38:12

评论太长了。

出现语法错误是因为内联子查询的格式不正确。不能从COUNT(*)函数开始;它们都需要是完全形式的SELECT语句。然后每一个都需要用括号括起来。

这就是您的查询应该是什么样子。

代码语言:javascript
复制
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。但是,如果没有样本数据进行测试,我就不能断定这个正常运行的查询版本是否会返回您想要的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55634566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档