SQL-запрос для определения количества определенных полей (Customer_ID)

Я хочу узнать количество Customer_ID:

Проблема 1: Ниже приведен код для определения количества Customer_ID, У меня есть 36 миллионов записей в моей базе данных. Когда я ввожу следующий запрос, чтобы найти количество Customer_ID, это занимает слишком много времени для запуска и, наконец, я получаю сообщение об ошибке ниже.

[Microsoft] Собственный клиент SQL Server 11.0, ошибка арифметического переполнения SQL Server при преобразовании выражения в тип данных int.(8115)

Мой запрос для определения количества Customer_ID:

SELECT Customer_ID,Count(*)
FROM [Customers]
GROUP BY Customer_ID;

Входная база данных:

S.no   Customer_ID    Country

 1.        456          INDIA
 2.        789          USA
 3.        1001         UK
 4.        456          AUSTRALIA
 5.        456          SINGAPORE
 6.        789          MALASIYA
 7.        1001         TAIWAN
 8.        1001         JAPAN
 9.        1001         AFRICA
 10.       1001         OMAN
 11.       123          DUBAI

Ожидаемый результат:

Customer_ID        Count of Customer_ID
      123                1
      456                3
      789                2
      1001               5

Пожалуйста, помогите мне достичь этого результата. Заранее благодарны за Вашу помощь.

2 ответа

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

Query1

SELECT Customer_ID, SUM(st.row_count) AS [Count of Customer_ID] 
FROM sys.dm_db_partition_stats st
WHERE object_name(object_id) = 'Customers' 
GROUP BY Customer_ID

Query2

SELECT Customer_ID, COUNT(*) AS [Count of Customer_ID]
FROM [Customers] WITH (NOLOCK)
GROUP BY Customer_ID

36 миллионов строк не должны вызывать ошибку переполнения. Ты можешь попробовать:

SELECT Customer_ID, Count_Big(*)
FROM [Customers]
GROUP BY Customer_ID;

Но это не должно быть необходимым, потому что ваша таблица не должна приводить к переполнению (если только "миллион" не означает "миллиард" в американском английском).

Для производительности, вы можете захотеть индекс на Customers(Customer_ID), Кажется вероятным, что у вас это есть, если Customer_Id является первичным ключом таблицы. Конечно, если это первичный ключ, то счетчик всегда будет равен "1", поэтому запрос не нужен.

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