首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Distinct和非distinct列选择

SQL Distinct和非distinct列选择
EN

Stack Overflow用户
提问于 2011-06-20 21:53:26
回答 2查看 2.1K关注 0票数 1

SQL distinct for 2 fields in a database

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

下面的SQL不是我写的,它可以给我们返回我们想要的数据。我添加了一行: group by pf.PatientID,pf.SubjectID

代码语言:javascript
复制
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
)

这给了我一个错误:

代码语言:javascript
复制
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.

我知道为什么我有这个错误了,它不在聚合函数中。我不确定的是如何将它聚合起来,据我所知,这会改变我的查询结果。

任何人都可以并愿意提供任何帮助,我们都非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2011-06-20 22:41:02

不是聚合的select语句中的任何内容也应该显示在group by区域中。如果你有

代码语言:javascript
复制
 Select A, B , C , D = Sum (E) From Table 
 Group By A, B, C

请注意,任何未聚合的内容都会在Group By区域中结束。因此,pf.ResearchAssistantID必须在Group By子句中。它应该运行得很好。

票数 1
EN

Stack Overflow用户

发布于 2011-06-20 23:13:17

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6412306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档