SQL计数和分组依据

时间:2015-02-17 21:01:19

标签: sql-server

我的表格中有5列

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在选择列表中无效,因为它不在Group By中   列表。

2 个答案:

答案 0 :(得分:0)

对于Transact SQL,当您的某个标记标识时,您必须在分组时以某种方式使用所有选定的列。

为此,您必须使用函数中的列(COUNTMAXAVG等),或者您必须按其分组。

分组仍然会为您提供列:

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

这将为您提供已选择的列,并根据分组给出模板的数量。因此,对于UserIDDepartmentJobCodeTemplate的每个不同组,它会为您计算。

如果您不想通过模板进行区分,请将其从选择列表中删除,但将其保留在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 = 5Department = 5JobCode = 5。然后,您可能会在这些列上有3行似乎重复,但Template会有所不同。在此示例中,它将等于Template = 32Template = 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

答案 1 :(得分: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