2011-06-20 68 views
0

SQL distinct for 2 fields in a databaseSQL區別和不明顯的列選擇

上面的鏈接,我相信是不是我所期待的太遠。有一篇文章談論我相信我需要什麼。它說,我應該讓我的領域不需要在總體上有所區別,然後我想區分的領域應該在一個group by子句中。

以下我沒有寫過的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語句中擁有哪個不是聚集的東西,都應該在group by area中顯示出來。 如果你有

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

注意無論是不是聚集在GROUP BY地區結束。因此, pf.ResearchAssistantID必須位於Group By子句中。它應該運行良好。

0

您必須按選擇列表中不是聚合的所有內容進行分組。這是幾乎所有數據庫中除mySQL以外的基本SQl。如果組中沒有字段並且兩個記錄的值不同,那麼它如何知道將哪一個放入結果集?你必須指定你想要的。您的唯一選擇是: 通過 包含組中的其他字段使用您想要選擇的值指定聚合。通常人們使用min()或max()。

即使在mySQl中,您也應該使用aggreagate方法或將它們添加到組中,否則它會爲您選擇一個值,並且可能不是您需要的值。