我的表格中有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中 列表。
答案 0 :(得分: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
。然后,您可能会在这些列上有3行似乎重复,但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
答案 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