2015-02-17 124 views
0

有5列在我的表SQL計數和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 2015-02-17 21:04:48

+0

當您使用聚合時,您只需要選擇聚合或聚合函數(如_count_或_avg_)中的列。如果你想顯示其他的字段,他們需要完成之前的一個陳述。 – 2015-02-17 21:07:57

回答

0

對Transact SQL,因爲你的標籤標識,你必須分組時使用所有選定列以某種方式。

爲此,您必須使用函數中的列(COUNTMAXAVG等),或者您必須按它們進行分組。

分組仍將給你列,不過:

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

這會給你你所選擇的列,並給模板的基於分組的數量。因此,對於UserID,Department,JobCodeTemplate的每個不同組,它會給你一個計數。

如果您不關心通過模板進行區分,請將其從選擇列表中刪除,但將其保留在COUNT函數中。

相反,您可以通過我使用的是公用表表達式做到這一點使用ROWNUMBER和分區在列,你想組:

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 = 5Department = 5,JobCode = 5。然後你可能會有3行在這些列上顯示爲重複,但是Template將有所不同。在本例中,它將等於Template = 32,Template = 4Template = 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

我想顯示所有列但只想計算分組按部門和作業代碼計數。我怎麼做? – Sam 2015-02-17 21:18:50

+0

在這種情況下,您可以使用rownumber,並對列進行分區。我編輯了我的答案。 – Phoenix 2015-02-17 21:24:06

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