Как использовать функцию Different and count, чтобы получить отдельных пользователей и количество отправленных сообщений

Вот эта таблица, по которой я сейчас пытаюсь сделать запрос. данные выглядят следующим образом:

--------------------------------
| 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.

Любая помощь будет здорово, спасибо.

Это SQL Server или MySQL? Пожалуйста, будьте внимательны при выборе тегов.

DavidG 15.07.2019 15:58

Тип данных (n)text устарел почти 15 лет назад в пользу (n)varchar(max).

Sean Lange 15.07.2019 15:58

@мальмонте. . . Синтаксис и вопрос похожи на SQL Server. Пожалуйста, отмечайте свои вопросы соответствующим образом.

Gordon Linoff 15.07.2019 15:58
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
215
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

используйте group by для агрегирования

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 

это возвращает количество, где значение столбца не равно нулю

На самом деле это не остановит ошибку, которую получает OP, поскольку Message — это ntext.

Larnu 15.07.2019 16:01

count(column) возвращает количество незначащих значений в столбце. ошибка связана с отсутствующей группой

ScaisEdge 15.07.2019 16:19

У вас был COUNT(Message) раньше, что было причиной ошибки, которую получал ОП.

Larnu 15.07.2019 16:21

ответ обновлен с обоими ... count (*) для ненулевых строк .. count (сообщение) не является нулевым значением null сообщения docs.microsoft.com/it-it/sql/t-sql/functions/…

ScaisEdge 15.07.2019 16:23
Ответ принят как подходящий

Используйте GROUP BY и COUNT(*):

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

Предположительно, Message никогда не бывает NULL, так что это делает то же самое.

Кстати, замените text на nvarchar(max) или varchar(max). text устарел. Как говорится в документация:

IMPORTANT! ntext, text, and image data types will be removed in a future version of SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

Это сработало, большое спасибо. Я также внес изменения в теги, которые вы предложили. Спасибо еще раз.

Caliman 15.07.2019 16:47

Исправьте свой тип данных, и тогда ваш запрос будет работать нормально:

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

Как упоминалось в комментариях, ntext устарел уже много лет, давно пора прекратить его использовать и использовать правильный.

Другие вопросы по теме