2015-02-17 2 views
0

Есть 5 колонок в моей таблицеSQL Count и Group By

Name, UserID, Depertment, JobCode, Template 

Я хочу найти Count(Template) Group By Department and JobCode но хочу выбрать другие столбцы тоже.

Мой запрос:

Select UserID, Department, JobCode, Template, Count(Template) 
From MyTable 
Group By Department, JobCode 

Получение ошибки:

UserID is invalid in selection list because it is not in the Group By list.

+0

Можете ли вы опубликовать образец своих данных и почему вы хотите, чтобы результаты были? – stuartd

+0

Когда вы используете агрегат, вам нужно выбрать только столбец в агрегационных или агрегатных функциях, таких как _count_ или _avg_. Если вы хотите отображать другие поля, они должны выполнить одно из предыдущих утверждений. –

ответ

0

Для Transact SQL, как один из ваших тегов отождествляет, вы должны использовать все выбранные столбцы каким-либо образом при группировке.

Для этого вы должны использовать столбцы в функции (COUNT, MAX, AVG и т. Д.), Или вы должны сгруппировать их.

Группировка по-прежнему дают вам столбцы, однако:

SELECT UserID, 
     Department, 
     JobCode, 
     Template, 
     COUNT(Template) 
FROM myTable 
GROUP BY UserID, Department, JobCode, Template 

Это даст вам столбцы, которые вы выбрали, и даст количество шаблонов на основе группировки. Поэтому для каждой отдельной группы UserID, Department, JobCode и Template, это даст вам счет.

Если вы не хотите различать по шаблону, удалите его из списка выбора, но сохраните его в функции COUNT.

С другой стороны, вы можете использовать RowNumber и раздел над колонной вы хотели бы группе я использую Common Table Expression, чтобы сделать это:

WITH CTE AS 
( SELECT UserID, 
      Department, 
      JobCode, 
      Template, 
      RowNum = ROW_NUMBER() OVER(PARTITION BY Template) 
    FROM myTable 
) 
SELECT UserID, Department, JobCode, Template 
FROM CTE 
WHERE RowNum > 0; 

Колонка RowNum даст вам перечисление числа времен Шаблон появился, учитывая другие столбцы. Например, у вас могут быть UserID = 5, Department = 5, JobCode = 5. Тогда у вас могут быть три строки, которые выглядят дублирующими в этих столбцах, однако Template будет отличаться. В этом примере он будет равен Template = 32, Template = 4 и Template = 101. Колонна RowNum будет увеличиваться на 1 для каждой строки, так что вы бы в общей сложности 3. Ниже:

-------------------------------------------------- 
| UserID | Department | JobCode | Template | RowNum 

| 5  | 5   | 5  | 32  | 1 

| 5  | 5   | 5  | 4  | 2 

| 5  | 5   | 5  | 101  | 3 
+0

Я хочу показать все столбцы, но хочу рассчитать подсчет группировки только по Департаменту и JobCode. Как мне это сделать? – Sam

+0

В этом случае вы должны использовать рябь и разбивать на столбец. Я отредактировал свой ответ. – Phoenix

0

В SQL Server, если вы используете агрегатор, то вы должны включать все поля, но вычисленное поле в группе.

CREATE TABLE #TemplateCount 
(UserId INT , 
Department VARCHAR(10) , 
JobCode INT , 
Template VARCHAR(10)) 


INSERT INTO #TemplateCount (UserId, Department, JobCode, Template) 
VALUES (1 , 'HR' , '12345' , 'A') , 
     (2 , 'HR' , '12346' , 'B') , 
    (3 , 'HR' , '12347' , 'C') 

SELECT UserID , 
    Department , 
    JobCode , 
    Template , 
    TemplateCount = COUNT(Template) 

FROM #TemplateCount 
GROUP BY UserId , Department , JobCode , Template