【问题标题】:SQL Distinct and non-distinct column selectionSQL Distinct 和 non-distinct 列选择
【发布时间】:2011-06-20 13:53:26
【问题描述】:

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.

我明白为什么会出现此错误,它不在聚合函数中。我不知道该怎么做是将它汇总,据我所知,这会改变我的查询结果。

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

【问题讨论】:

  • 当然添加聚合会改变结果,但添加 group by 已经改变了它。如果您不想更改结果,请不要更改查询,如果您确实想更改它,您应该更好地解释结果现在的外观以及您希望它的外观。最好有一个简短的样本。
  • 同意,您想通过添加 GROUP BY 语句来达到什么目的?在什么情况下,您会获得多条记录,而您只需要/期望一条记录?

标签: sql select distinct


【解决方案1】:

无论您在 select 语句中拥有的不是聚合的内容,都应该按区域显示在分组中。 如果你有

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多