2010-02-28 8 views
4

그래서 내가 잘 작동이 문을 얻었다. 그래서그룹 SQL 문에 의해

SELECT MAX(patient_history_date_bio) AS med_date, medication_name, medication_dose 
FROM  biological 
WHERE (patient_id = 12) 
GROUP BY medication_name 

을이를 입력, 그것은 말을 나에게 오류를 제공합니다

"coumn 'biological.medication_dose' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.".

그래서 내가 GROUP BY 절에 medication_dose를 추가하려고하지만, 그것은 나에게 내가 '돈 여분의 행을 제공합니다 싶어. 테이블에있는 각 약물에 대한 최신 행을 가져오고 싶습니다. (최신 행은 max 함수에 의해 결정되어 최신 날짜를 얻습니다).

이 문제를 어떻게 해결합니까?

+0

그것은 OP는 보이는 것처럼를 SQL Server를 사용합니다. –

+0

Visual Studio 2008에서 C#으로 코딩하는 데 사용되는 코드입니다. 나는 그것이 바로 SQL 서버라고 생각하니? – jello

+0

참고 사항 : http://stackoverflow.com/questions/121387/sql-fetch-the-row-which-has-the-max-value-for-a-column, http://stackoverflow.com/questions/ 95866/select-max-in-group, http://stackoverflow.com/questions/612231/sql-selectrows-with-maxcolumn-value-distinct-by-another-column 및 기타 여러 가지가 있습니다. – outis

답변

5

사용이 :

SELECT b.medication_name, 
     b.patient_history_date_bio AS med_date, 
     b.medication_dose 
    FROM BIOLOGICAL b 
    JOIN (SELECT y.medication_name, 
       MAX(y.patient_history_date_bio) AS max_date 
      FROM BIOLOGICAL y 
     GROUP BY y.medication_name) x ON x.medication_name = b.medication_name 
            AND x.max_date = b.patient_history_date_bio 
WHERE b.patient_id = ? 
+0

+1 - 나를 게시하기 만하면됩니다. MAX()가 줄 수있는 최고 복용량이 아니라 최신 복용량을 줄 것이므로 올바른 (그리고 의학적으로 안전한) 답입니다 (반드시 최신 복용량 일 필요는 없습니다). 내 유일한 추가 사항은 동일한 날짜의 레코드가 여러 개있는 경우입니다. 그렇다면 다른 필드를 사용하여 최신 필드 (예 : IDENTITY 필드)를 결정해야합니다. – AdaTheDev

+0

thx 많은 남자 (심지어 tho 나는 당신의 성명을 이해하는 데 조금 어려움이있다. .. 어떤 걱정이라도 그것을 이해할 것이다). 늦은 답장을 보내 주셔서 죄송합니다 – jello

+0

hmmmm 이상하게 보입니다. 작동하지 않는 것 같아요. 3 행을 제공하는 동안 2 행만 제공합니다 ... – jello

0

max(medication_dose)을 선택해야합니다. Group by은 group by 절의 필드에 고유 한 값을 포함하는 결과 집합을 반환하므로 분명히 동일한 medication_name이지만 서로 다른 선량을 가진 여러 레코드가 있으므로 두 개의 결과가 표시됩니다.

max(medication_dose)을 입력하면 각 medication_name의 최대 복용량 값이 반환됩니다. 복용량 (최대, 최소, 평균, 등)에 대한 모든 집계 함수를 사용할 수 있습니다.

1

빠른 해결 방법으로 medication_doseMAX(medication_dose)과 같은 집계 함수를 적용 할 수 있습니다.

그러나 이것은 일반적으로 사용자가 쿼리를 잘못 작성했거나 데이터베이스 스키마를 리팩터링/정규화해야한다는 것을 나타냅니다. 귀하의 경우에는 쿼리를 잘못 처리 한 것처럼 보입니다. 올바른 접근법은 OMG Poinies in another answer에 의해 제안 된 접근 방식입니다.

이 오류 뒤에 이유를 설명하는 다음과 같은 흥미로운 기사 체크 아웃에 관심이있을 수 :