使用CASE对条件分组进行故障排除(SQL Server 2008)

ilmyapht  于 2022-10-03  发布在  SQL Server
关注(0)|答案(1)|浏览(202)

我希望有人愿意帮忙。我是SQL的新手,很难调试一个简单的查询。

我想创建一个简单的频率表来查看ARRESTDATE字段缺少多少值(即=00000000)。

SELECT 
CASE WHEN ArrestDate=00000000 THEN 'NO DATE' ELSE 'HAS DATE' END AS HasDate,
CASE WHEN ArrestDate=00000000 THEN 0 ELSE 1 END as nDate
FROM ARREST_INFO
--GROUP BY HasDate
--GROUP BY CASE WHEN ArrestDate=00000000 THEN 'NO DATE' ELSE 'HAS DATE' END
  • 第1-4行分析没有错误(输出如下)。
  • 第5行返回:列名‘HasDate’无效。
  • 第6行返回:‘ARCHARK_INFO.ARRESTDate’在选择列表中无效,因为它既没有包含在聚合函数中,也没有包含在GROUP BY子句中。

由于第1-4行运行正常,我尝试将它们 Package 在另一个SELECT语句中,但这也导致了一个错误(“INVALID列名‘HasDate’”)。

SELECT * FROM (
    SELECT 
    CASE WHEN ArrestDate=00000000 THEN 'NO DATE' ELSE 'HAS DATE' END AS HasDate,
    CASE WHEN ArrestDate=00000000 THEN 0 ELSE 1 END as nDate
    FROM ARREST_INFO
    )

GROUP BY HasDate
--GROUP BY CASE WHEN ArrestDate=00000000 THEN 'NO DATE' ELSE 'HAS DATE' END

遗憾的是,我无法更新SQL Server版本。如果您有任何见解,我将不胜感激!

neekobn8

neekobn81#

这个对上一个问题的回答至少帮助我解决了部分问题。我的Select语句引用了2列(nDate和HasDate),但Group by语句只引用了其中的一列,因此SQL没有足够的信息来确定如何显示未聚合的列数据。

@Bill Karwin写道:https://stackoverflow.com/a/13999903/9499084
这演示了单值规则,该规则禁止在运行GROUP BY查询时获得未定义的结果,并且选择列表中包含的任何列既不是分组条件的一部分,也不出现在聚合函数(SUM、MIN、MAX等)中。

我仍然不知道为什么当在Group by语句中重新部署Select语句(HasDate)中定义的新列时,SQL不能识别它,但至少我现在有了功能代码--请参见下面的屏幕截图以查看结果。

以下是我的更新代码:

SELECT 
CASE WHEN ArrestDate=00000000 THEN 'NO DATE' ELSE 'HAS DATE' END AS HasDate,
SUM(CASE WHEN ArrestDate=00000000 THEN 0 ELSE 1 END) AS nDate,
COUNT(*) as TotalCases

FROM ARREST_INFO
GROUP BY CASE WHEN ArrestDate=00000000 THEN 'NO DATE' ELSE 'HAS DATE' END

enter image description here

相关问题