SQL Отличительный и нечеткий выбор столбцов - PullRequest
0 голосов
/ 20 июня 2011

Отличный SQL для 2 полей в базе данных

Ссылка выше, я считаю, не слишком далека от того, что я ищу. Был пост, в котором говорилось о том, что мне нужно. В нем говорится, что у меня должны быть поля, которые НЕ должны различаться в совокупности, а затем те, которые я хочу различить, должны быть в предложении 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.

Я понял, почему у меня есть эта ошибка, она не в статистической функции. То, что я не уверен в том, как это сделать, это получить его в совокупности, что, насколько мне известно, изменит результаты моего запроса.

Любая помощь, которую кто-либо может и желает предложить, очень ценится!

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Все, что у вас есть в операторе выбора, которое не является агрегатом, также должно отображаться в группе по области.Если у вас есть

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

Обратите внимание, что все, что не сгруппировано, попадает в Группу по области.Таким образом, pf.ResearchAssistantID должен быть в предложении Group By.И все должно работать нормально.

0 голосов
/ 20 июня 2011

Вы должны сгруппировать по всему списку выбора, который не является совокупным.Это фундаментальный SQl, реализованный практически во всех базах данных, кроме mySQL.Если у вас нет поля в группе и значения для двух записей различны, как он узнает, какое из них поместить в набор результатов?Вы должны указать, какой вы хотите.Вы можете выбрать только одно: включить другое поле в группу с помощью параметра Укажите, используя агрегат, какое значение вы хотите выбрать.Обычно люди используют min () или max ().

Даже в mySQl вы должны использовать агрегированный подход или добавить их в группу, так как в противном случае вы выберете значение для вас, и это может быть не то, что вынеобходимость.

...