/ / SQL Wyraźny i nierozróżnialny wybór kolumn - sql, select, distinct

SQL Odrębny i nierozróżnialny wybór kolumn - sql, select, distinct

SQL odrębny dla 2 pól w bazie danych

Powyższy link uważam, że nie jest zbyt daleko od tegoSzukam jednego postu, który mówi o tym, czego potrzebuję, i mówi, że powinienem mieć moje pola, które NIE muszą być odrębne w zbiorach, a te, które chcę odróżnić, powinny być w klauzuli group by .

Poniższy SQL, którego NIE napisałem, działa na potrzeby przekazania nam żądanych danych. Dodałem linię: 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
)

Daje mi to błąd:

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.

Rozumiem, dlaczego mam ten błąd, nie ma on funkcji agregującej, ale nie jestem pewny, jak to zrobić, aby uzyskać go w postaci zagregowanej, co według mojej wiedzy zmieniłoby wyniki mojego zapytania.

Każda pomoc, którą ktoś może i chce zaoferować, jest bardzo ceniona!

Odpowiedzi:

1 dla odpowiedzi № 1

Cokolwiek masz w oświadczeniu select, które nie jest agregatem, powinno pojawić się również w grupie według obszaru. Jeśli masz

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

Zwróć uwagę na to, co nie jest zagregowane w obszarze grupowania według. pf.ResearchAssistantID musi należeć do klauzuli Group By Clause. I powinno działać dobrze.


0 dla odpowiedzi nr 2

Musisz pogrupować wszystko według wyborulista, która nie jest agregatem. To podstawowe SQL, które zostało zaimplementowane w niemal każdej bazie danych z wyjątkiem MySQL .Jeśli nie masz pola w grupie, a wartości dla dwóch rekordów są różne, skąd wiedziałaby, którą z nich umieścić w zestawie wyników? Musisz określić, który z nich chcesz. Twoje jedyne możliwości to: Dołącz drugie pole w grupie przez Podaj za pomocą agregatu wybraną wartość. Zwykle ludzie używają min () lub max ().

Nawet w mySQl powinieneś użyć podejścia aggreagate lub dodać je do grupy, ponieważ w przeciwnym wypadku wybierze wartość dla ciebie i może nie być tą, której potrzebujesz.