首页 > 解决方案 > varchar MS SQL server 中的平均字符数

问题描述

我目前正在尝试从标记为 job_notes 的表中选择多个列,包括 note_id、notes_date_time、comments、DATALENGTH(comments) 作为“note_length”。

但是,我只打算在评论中的字符长度大于其他评论的平均长度时显示上述内容。(注释的数据类型是 VARCHAR 东西)。

我还打算按评论的长度降序排列。

这是我的代码:

SELECT note_id, notes_date_time, comments, DATALENGTH(comments) AS 'note_length'
FROM job_notes
WHERE DATALENGTH(comments) > AVG(DATALENGTH(comments))
ORDER BY DATALENGTH(comments) DESC;

执行后,我遇到以下错误消息

聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

任何帮助将不胜感激。谢谢!

标签: sqlsql-server

解决方案


如错误所述,您不能在 中使用聚合函数WHERE,并且 在HAVING这里也无济于事。就个人而言,我建议使用 CTE 和 Windowed Aggregate 函数:

WITH CTE AS
    (SELECT note_id,
            notes_date_time,
            comments,
            DATALENGTH(comments) AS Note_Length, --Don't use single quotes for aliases, they are meant for literal strings
            AVG(DATALENGTH(comments)) OVER () AS Avg_Note_Length
     FROM dbo.job_notes)
SELECT note_id,
       notes_date_time,
       comments,
       Note_Length --Don't forget to divide by 2 if you want characters and this is an nvarchar
FROM CTE
WHERE Note_Length > Avg_Note_Length;

推荐阅读