如何使用“不重复计数”功能获取不重复的用户和发送的邮件数

时间:2019-07-15 13:56:50

标签: sql sql-server

我正在尝试对此表进行查询。数据如下所示:

--------------------------------
| Message_Time | User | Message|
--------------------------------
|y-m-d H:M:S   |User1 | msg-body
|y-m-d H:M:S   |User1 | msg-body
|y-m-d H:M:S   |User1 | msg-body
|y-m-d H:M:S   |User2 | msg-body
|y-m-d H:M:S   |User2 | msg-body

我正在尝试选择用户并计算每个用户发送的邮件数量

我试图从该数据库中选择一个,并在“用户”列上进行区分,并在“消息”列上进行计数,但是我一直遇到错误。我确定我没有采用正确的方法。

我尝试了以下查询:

SELECT DISTINCT(USER) AS [User_ID], COUNT(Message) AS [Messages_Sent] 
FROM [dbo].[Table]

这是我想要的输出:

--------------------------
| User_ID | Messages_Sent|
--------------------------
|User1    |       3      | 
|User2    |       2      | 

但是不幸的是,这是发生的错误:

Operand data type ntext is invalid for count operator.

任何帮助都会很棒,谢谢。

3 个答案:

答案 0 :(得分:2)

使用GROUP BYCOUNT(*)

SELECT USER AS [User_ID], COUNT(*) AS [Messages_Sent] 
FROM [dbo].[Table]
GROUP BY USER;

大概Message永远不会是NULL,所以这样做也是一样。

text替换为nvarchar(max)varchar(max)text已过时。正如documentation所述:

  

重要!在将来的SQL Server版本中,将删除ntext,text和image数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max),varchar(max)和varbinary(max)。

答案 1 :(得分:0)

使用分组依据进行

SELECT USER AS [User_ID], COUNT(*) AS [Messages_Sent] 
FROM [dbo].[Table]
GROUP BY USER 

此返回的行不为空

聚集功能始终返回不同的结果

SELECT USER AS [User_ID], COUNT(message) AS [Messages_Sent] 
FROM [dbo].[Table]
GROUP BY USER 

这将返回列值不为null的计数

答案 2 :(得分:0)

修复数据类型,然后查询将正常工作

ALTER TABLE dbo.[Table] ALTER COLUMN Message nvarchar(MAX);

在评论ntext中已经提到,已弃用多年,现在已经是停止使用它并使用正确的了。