2017-02-21 3 views
0

с помощью SQL Server 2012.Count вычисленное поле

У меня есть следующий код:

Select Distinct [A_number] + '-' + convert(varchar(10),[zone]) As myNumber 
FROM [dbo].[soils]; 

Мне нужно изменить этот запрос, чтобы дать мне количество каждого myNumber. С уважением,

ответ

1

Что я хотел бы сделать, это использовать group by заявление:

SELECT A_number, 
    zone, 
    COUNT(*) AS c 
FROM dbo.soils 
GROUP BY A_number, 
    zone; 

Затем используйте, что приводит к Concat ваши поля. Действовать таким образом позволит использование индексирование:

WITH numbers AS (
    SELECT A_number, 
     zone, 
     COUNT(*) AS c 
    FROM dbo.soils 
    GROUP BY A_number, 
     zone 
) 
SELECT A_number + '-' + convert(varchar(10),zone) As myNumber, 
    c AS number_count 
FROM numbers; 
+0

Выполнение группы по горизонтальным столбцам - это нормативный шаблон. Это позволяет использовать подходящий индекс. Без предложения WHERE лучшая ставка для оптимального индекса для этого запроса имела бы ведущие столбцы '(A_number, zone)'. +10. Существует край, где этот запрос возвращает другой результат из оригинала. Рассмотрим строки с '(A_number, zone)' значениями '('1 -', 'a')' и '('1', '- a')'. – spencer7593

0

Использование COUNT()

SELECT COUNT(DISTINCT [A_number] + '-' + CONVERT(VARCHAR(10),[zone])) 
FROM [dbo].[soils] 

, который даст вам счет на уникальный myNumber от преобразования.

И рассмотрите GROUP BY, если вам нужно количество каждого уникального номера.

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]), COUNT(*) 
FROM [dbo].[soils] 
GROUP BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 
+0

Спасибо, но мне нужно количество каждого уникального mynumber, а не общее число уникальных mynumber – PeterTheGeo

+0

. Рассмотрим «GROUP BY» – ydoow

0

Чтобы получить количество строк, связанных с каждым значением myNumber, канавы DISTINCT и использовать GROUP BY вместо этого.

Наиболее простой пример, повторить выражение в списке выбора в GROUP BY предложения:

SELECT [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) AS myNumber 
    , COUNT(*) AS cnt 
    FROM [dbo].[soils] 
GROUP 
    BY [A_number] + '-' + CONVERT(VARCHAR(10),[zone]) 

Для тривиальных наборов, производительность не будет проблемой. Для больших наборов производительность может пострадать. Решение состоит в том, чтобы переработать запрос, чтобы воспользоваться существующими индексами или добавить соответствующие индексы.

+0

@JRLambert: вы правы. DOH! Полностью пропущен агрегат 'COUNT (*)'. Исправлено. Я также мог бы использовать 'SUM (1) AS cnt' – spencer7593

Смежные вопросы