区别没有返回预期的结果?

时间:2011-08-29 21:26:13

标签: sql sql-server-2005 tsql sql-server-2008

这段代码有什么问题(或者我的理智: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

4 个答案:

答案 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