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.
我知道为什么我有这个错误,它不在聚合函数中。我不知道该怎么做就是把它集中在一个聚合中,根据我的知识会改变我的查询结果。
非常感谢任何人能够并且愿意提供的任何帮助!
答案 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方法或将它们添加到组中,否则它将为您挑选一个值,它可能不是您需要的值。