2013-06-04 3 views
2

У меня есть общий запрос, такие как:Подсчет количества записей, возвращаемых каждой группы

SELECT col1, col2, col3, col4 
FROM Table1 AS t1 
GROUP BY col1, col2, col3, col4 

Он возвращает таблицу что-то похожее на:

col1 col2 col3 col4  
data1 data2 data3 data4 
data1 data2 data3 data5 
data10 data11 data12 data13 
data10 data11 data12 data14 
data10 data11 data12 data15 

Мне нужно, чтобы получить количество для col1 для отображения данных1 возвращается дважды, а data10 возвращается три раза. Таблица должна выглядеть так:

col1 col2 col3 col4 Count 
data1 data2 data3 data4 2 
data1 data2 data3 data5 2 
data10 data11 data12 data13 3 
data10 data11 data12 data14 3 
data10 data11 data12 data15 3 

Я попытался подсчитать (*) в инструкции выбора, но это не сработает.

ответ

5

Вы можете использовать пункт OVER (SQL Server 2008+):

SELECT col1, col2, col3, col4, COUNT(*) OVER(PARTITION BY col1) [Count] 
FROM Table1 AS t1 

Результаты являются:

╔════════╦════════╦════════╦════════╦═══════╗ 
║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COUNT ║ 
╠════════╬════════╬════════╬════════╬═══════╣ 
║ data1 ║ data2 ║ data3 ║ data4 ║  2 ║ 
║ data1 ║ data2 ║ data3 ║ data5 ║  2 ║ 
║ data10 ║ data11 ║ data12 ║ data13 ║  3 ║ 
║ data10 ║ data11 ║ data12 ║ data14 ║  3 ║ 
║ data10 ║ data11 ║ data12 ║ data15 ║  3 ║ 
╚════════╩════════╩════════╩════════╩═══════╝ 

Here is a sqlfiddle с демонстрационной этого.

UPDATE Если вам нужно фильтровать на COUNT колонке, вы можете использовать производную таблицу или КТР:

Производная таблица:

SELECT * 
FROM ( SELECT col1, col2, col3, col4, COUNT(*) OVER(PARTITION BY col1) [Count] 
     FROM Table1) A 
WHERE [Count] > 2 

КТР:

;WITH CTE AS 
(
    SELECT col1, col2, col3, col4, COUNT(*) OVER(PARTITION BY col1) [Count] 
    FROM Table1 
) 
SELECT * 
FROM CTE 
WHERE [Count] > 2 

Результаты:

╔════════╦════════╦════════╦════════╦═══════╗ 
║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COUNT ║ 
╠════════╬════════╬════════╬════════╬═══════╣ 
║ data10 ║ data11 ║ data12 ║ data13 ║  3 ║ 
║ data10 ║ data11 ║ data12 ║ data14 ║  3 ║ 
║ data10 ║ data11 ║ data12 ║ data15 ║  3 ║ 
╚════════╩════════╩════════╩════════╩═══════╝ 

sqlfiddle with this option.

+0

Спасибо! Я соглашусь через 9 минут. – Andrew

+0

@Andrew Нет проблем. – Lamak

+0

Могу ли я добавить предложение having или where, чтобы захватить только те, чье число> 2? – Andrew

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