我希望有人愿意帮忙。我是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版本。如果您有任何见解,我将不胜感激!
1条答案
按热度按时间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不能识别它,但至少我现在有了功能代码--请参见下面的屏幕截图以查看结果。
以下是我的更新代码:
enter image description here