这段代码有什么问题(或者我的理智:D)。
Select语句中的 Distinct 子句无效。它的结果集包含ej中每个EmpID的所有行。请帮忙!!
Declare @SurveyID int;
SET @SurveyID = 2;
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t1
SELECT Distinct(ej.EmpID),
ej.JobCode,
ej.SurveyID,
ej.IsCompleted,
Coalesce(ej.Declined,0) AS Declined,
emp.Company,
emp.UserID,
emp.LoginRecord,
count(JobCode) AS Benchmark
into #t
FROM SAS.EmployerJobs ej
INNER JOIN SAS.Employer emp
ON ej.EmpID = emp.EmpID
Where (ej.SurveyID = @SurveyID)
GROUP BY ej.EmpID, ej.JobCode, ej.SurveyID, ej.IsCompleted, Declined, emp.Company, emp.UserID, emp.LoginRecord
Order by ej.EmpID ASC
Select * from #t
drop table #t
答案 0 :(得分:3)
您无法在SQL Server中的特定列上选择distinct。
由于此SQL Server正在返回每个不同的列组合。你要求它做的是随意丢弃你告诉它选择的数据。
如果您希望它开始删除记录,那么您需要指定所需的记录。一种方法是为不想重复的列指定MIN或MAX值。
我倾向于避免这样做,因为根据我的经验,大多数时候发生这种情况是因为查询中存在奇怪的逻辑。如果没有查看您的源数据并了解您的业务规则,就很难告诉您如何更改查询。
<强>更新强>
根据您的评论:
业务规则是计算每个JobCodes的数量(作为基准) EmployerJobs表中的EmpID(在SurveyID上过滤后)。
我会将您的查询更改为:
SELECT EmpID,
COUNT(DISTINCT JobCode)
FROM SAS.EmployerJobs
Where SurveyID = @SurveyID
GROUP BY EmpId
这将返回每个EmpId
以及与该ID相关联的不同JobCode
的数量。如果您给我的业务规则是累积的,那么您的查询的其余部分正是我所谈论的那种奇怪的逻辑。
答案 1 :(得分:2)
如果结果集中每个不同的EmpID只需要一行,那么您需要决定如何为每个EmpID聚合多行数据(多个作业)。例如,选择最小值。
但是从名称和关系来看,似乎EmpID可以有多个作业,所以如果你还希望列出单个作业,那么每个EmpID只需要一行似乎没有意义。
更新:计算JobCodes的数量
SELECT ej.EmpID,
ej.SurveyID,
emp.Company,
emp.UserID,
emp.LoginRecord,
count(JobCode) AS Benchmark
into #t
FROM SAS.EmployerJobs ej
INNER JOIN SAS.Employer emp
ON ej.EmpID = emp.EmpID
Where (ej.SurveyID = @SurveyID)
GROUP BY ej.EmpID, ej.SurveyID, emp.Company, emp.UserID, emp.LoginRecord
Order by ej.EmpID ASC
您的原始查询尝试提取每个作业不同的数据,这就是您没有获得聚合的原因。 (例如,IsCompleted,拒绝等。)为了使聚合工作,只包括作为工作数据聚合的数据,如count(JobCode)
,或者不按工作变化,例如雇主属性。
答案 2 :(得分:1)
区别不是功能。请看这里获得一个很好的解释。
http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx
您使用它的distinct关键字只会确保结果集中不会包含所有返回列的重复项。
使用group by子句获得所需的结果。
http://msdn.microsoft.com/en-us/library/ms177673.aspx
请注意,您需要在select子句中未包含在group by子句中的任何列上使用聚合函数(例如,sum,max,avg)。
如果您希望结果只为每个员工ID包含一行,那么这是您应该在group by子句中包含的唯一列。
试试这个(请注意,临时表在此处不添加任何值,并且已被删除)。
SELECT
EmpID,
COUNT(*)
FROM
SAS.EmployerJobs
Where
SurveyID = @SurveyID
GROUP BY
EmpId
注意:如果员工可以多次与同一工作相关联,请使用Abe Miessler的答案。
答案 3 :(得分:0)
你想要它做什么?为什么你有一个区别和一个分组?
SELECT
ej.EmpID,
ej.JobCode,
ej.SurveyID,
ej.IsCompleted,
Coalesce(ej.Declined,0) AS Declined,
emp.Company,
emp.UserID,
emp.LoginRecord,
count(JobCode) AS Benchmark
FROM SAS.EmployerJobs ej
INNER JOIN SAS.Employer emp
ON ej.EmpID = emp.EmpID
Where ej.SurveyID = '2'
GROUP BY ej.EmpID, ej.JobCode, ej.SurveyID, ej.IsCompleted, Declined, emp.Company, emp.UserID, emp.LoginRecord
Order by ej.EmpID ASC