SQL不同且不同的列选择

时间:2011-06-20 13:53:26

标签: sql select distinct

SQL distinct for 2 fields in a database

上述链接我认为与我正在寻找的并不太远。有一篇文章谈论我认为我需要什么。它说我的字段不需要在聚合中是不同的,然后我想要的字段应该是group by子句。

我编写的以下SQL不能用于回馈我们想要的数据。我添加了行:group by pf.PatientID,pf.SubjectID

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[getResearchAssistantProgressReportByStudyAndLoation]
(   
    @StudyId int,
    @LocationID int,
    @ResearchAssistantID int,
    @StartDate datetime,
    @EndDate datetime
)
RETURNS TABLE 
AS
RETURN 
(

Select 
    pf.PatientID, pf.SubjectID, pf.ResearchAssistantID,
    study.form, pf.dateAvailable, pf.DateComplete, 
    CAST((CASE WHEN pf.dateavailable + convert(int,study.daystoexpire,101) < GETDATE() and pf.dateComplete is null then 'True' else 'False' END) AS varchar(10)) as Expired
FROM 
    PatientForms pf
    INNER JOIN (SELECT * FROM getFormsINStudy(@StudyId)) as study
    on pf.formID = study.FormID
    INNER JOIN UserLocations ul on pf.patientid = ul.userid
WHERE 
    ul.LocationID = @LocationID
    and (ResearchAssistantID = @ResearchAssistantID or @ResearchAssistantID = -1)
    and (pf.DateAvailable + convert(int,study.daystoexpire,101)) > @StartDate
    and (pf.DateAvailable + convert(int,study.DAYSTOEXPIRE,101)) < @EndDate
group by pf.PatientID, pf.SubjectID
)

这给了我一个错误:

Msg 8120, Level 16, State 1, Procedure getResearchAssistantProgressReportByStudyAndLoation, Line 20
Column 'PatientForms.ResearchAssistantID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我知道为什么我有这个错误,它不在聚合函数中。我不知道该怎么做就是把它集中在一个聚合中,根据我的知识会改变我的查询结果。

非常感谢任何人能够并且愿意提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

您在非聚合的select语句中所拥有的内容也应按区域显示。 如果你有

 Select A, B , C , D = Sum (E) From Table 
 Group By A, B, C

请注意,在“按区域分组”中最终未汇总的内容。所以, pf.ResearchAssistantID必须在Group By子句中。它应该运行良好。

答案 1 :(得分:0)

您必须按选择列表中不是聚合的所有内容进行分组。除了mySQL之外,几乎每个数据库都实现了基本的SQl。如果组中没有字段,并且两个记录的值不同,那么它如何知道将哪一个放入结果集?您必须指定所需的那个。您唯一的选择是: 在组中包含其他字段 使用您想要选择的值的聚合指定。通常人们使用min()或max()。

即使在mySQl中,您也应该使用aggreagate方法或将它们添加到组中,否则它将为您挑选一个值,它可能不是您需要的值。