2011-06-20 7 views
0

SQL distinct for 2 fields in a databaseSQL明白で明確でない列の選択

上記のリンクは、私が探しているものとはあまり離れていないと思います。私が必要と信じていることについて話す投稿がありました。それは私が集計で区別する必要がない私のフィールドを持っている必要がありますし、私は別のグループ句にする必要がありますしたいものを言う。

私が書いていない次のSQLは、私たちが望むデータを返すために働きます。私はラインを追加しました: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. 

は私が得る、それは集約関数ではありません。私のやり方が分からないのは、それを集約して取得することです。知識があれば、クエリの結果は変わります。

誰でも助けることができ、喜んで提供していただけるお役に立てれば幸いです!

+1

集計を追加すると結果は変わりますが、 'group by'を追加すると既に変更されています。結果を変更したくない場合は、単にクエリを変更しないでください。変更する場合は、結果がどのように表示され、どのように表示するかをよく説明してください。短いサンプルで最高です。 –

+0

合意した、あなたはGROUP BYステートメントを追加して何を達成しようとしていますか?どのシナリオで複数のレコードを取得したいのですか? – MatBailie

答えて

1

集計ではない選択ステートメントにあるものは、グループ別にも表示されます。 あなたが

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

をお持ちの場合は集約されていないものは何でもお知らせをグループ化エリアで終わります。したがって、 pf.ResearchAssistantIDはGroup By句に含まれていなければなりません。そしてそれはうまく動作するはずです。

0

選択リストで集計ではないすべてのものをグループ化する必要があります。これは、MySQLを除くほぼすべてのデータベースで実装されている基本的なSQlです。グループ内にフィールドがなく、2つのレコードの値が異なる場合、どのレコードを結果セットに入れるかはどのように分かりますか?必要なものを指定する必要があります。唯一の選択肢は次のとおりです。 グループに他のフィールドを追加します。 選択したい値を集約として指定します。通常、人々はmin()またはmax()を使用します。

mySQlの場合でも、aggreagateアプローチを使用するか、それ以外の場合は値を選ぶ必要があるため、グループに追加する必要があります。

関連する問題