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.我知道为什么我有这个错误了,它不在聚合函数中。我不确定的是如何将它聚合起来,据我所知,这会改变我的查询结果。
任何人都可以并愿意提供任何帮助,我们都非常感谢!
发布于 2011-06-20 22:41:02
不是聚合的select语句中的任何内容也应该显示在group by区域中。如果你有
Select A, B , C , D = Sum (E) From Table
Group By A, B, C请注意,任何未聚合的内容都会在Group By区域中结束。因此,pf.ResearchAssistantID必须在Group By子句中。它应该运行得很好。
发布于 2011-06-20 23:13:17
您必须按选择列表中不是聚合的所有内容进行分组。这是除了mySQL之外的几乎所有数据库中实现的基本SQl。如果group by中没有字段,并且两个记录的值不同,它如何知道将哪个记录放入结果集中?您必须指定所需的类型。您唯一的选择是:通过使用聚合指定要选择的值,将其他字段包括在组中。通常人们使用min()或max()。
即使在mySQl中,您也应该使用aggreagate方法或将它们添加到group by中,否则它将为您挑选一个值,而它可能不是您需要的值。
https://stackoverflow.com/questions/6412306
复制相似问题