2009-06-25 1 views
1

일부 숫자를 계산하는 일부 SQL 문이 있습니다. 보너스 포인트/페널티 포인트로 최종 점수 100 점 (보너스 포인트 포함) 또는 (페널티 포함)이 가능할 수 있습니다. 그것을 초과하는 경우SQL Server에서 내 하드 코딩 된 천장 및 바닥을 정의하려면 어떻게합니까?

어떻게, 값이 계산되도록 할 수 있습니다 100 그것의 취득 점수가 0 이하로되는 것을 포기 끝나는 경우 또는, 다음은 0

난에 min'd 것 (100)에 끝나가 이 수학을하는 간단한 UDF를 사용할 수 있다고 가정하면 어렵지 않습니다. 이미 존재하는지 모르겠습니다.

나는 CEILINGMAX을 확인했으며이 두 가지 모두 내가하고있는 일이 아닌 다른 일을하고 있습니다.

생각하십니까?

답변

1

테스, 그것은 좋은 것 "수평"집계 기능을 사용하면 다른 사람들이 제안한 바를 정확하게 수행 할 수 있습니다. "MIN (점수, 100)"등. 슬프게도 그렇게하지 못합니다.

이 작업을 수행하는 일반적인 방법은 CASE 표현식 함께 :

SELECT 
    CASE WHEN Score BETWEEN 0 AND 100 THEN Score 
     WHEN Score < 0 THEN 0 
     ELSE 100 END as BoundScore 
FROM YourTable 
+0

이 case 문이 스칼라 값 함수에있는 경우 성능이 저하됩니까? –

+0

예. 얼마나 많은지는 잘 모르지만 큰 행 집합에서는 대개 중요합니다. – RBarryYoung

0

점수가 테이블의 열에 저장되거나이 제한 조건에 일부 계산 된 총계가 있음을 의미합니까?

일반적으로 가장 쉬운 방법은 삽입되는 값을 확인하는 트리거에 로직을 넣는 것입니다. 범위를 벗어난 경우 최대 또는 최소로 변경하십시오.

또는 데이터베이스 무결성 문제가 아니기 때문에 어떤 추상화 수준에서도 값을 삽입하는 것이지만 데이터베이스 무결성 문제가 아니라 응용 프로그램 유효성 검사 문제이므로 사용하는 것이 좋습니다.

+0

점수가 계산되는 것으로, 어떤 테이블 필드 (아직)에 저장되지 않았습니다. 이미 최종 값을 보유 할 필드에 대한 점검 제한 조건이 있습니다. 하지만 사용자 정의 스칼라 함수 (일명 UDF)가 괜찮은지 궁금 해서요. –

0

실제로 트리거가 정확하고 유일한 솔루션입니다.

트리거와 트리거가 모두 필요합니다. UPDATE와 INSERT (또는 UPDATE와 INSERT를위한 두 개의 개별 트리거)가 실행됩니다. 해당 열의 제안 된 새 값을 확인한 다음 필요에 따라 위 또는 아래로 밀어 넣기 만하면됩니다.

http://msdn.microsoft.com/en-us/library/aa258254(SQL.80).aspx

제약은 선택 사항이된다, 그러나 아주 좋습니다.

+0

나는 왜 방아쇠가 유일한 해결책인지 여기에서 볼 수 없습니까? 왜? 내가 선택한 쿼리에서 수학/계산을하고있다. 그렇다면 결과를 일부 테이블에 저장하기 전에 결과를 고칠 수없는 이유는 무엇입니까? –

0

당신은 다음 트리거를 사용하지 않으려면 방법에 대한

MIN (MAX (XXX, 0), 100) XXX 당신이 점수를 계산해야 어떤 기존의 코드입니다.

예 : SQL Server가 ANSI-SQL이 있다면 MIN (MAX (enemiesKilled + 10 * LivesLeft + * 15 * 합계 (PrincessRescued가), 0), 100)

+0

그게 내가 생각한 것도 ..하지만 MIN/MAX는 하나의 인수 만받습니다 ... ???? wa와 같은 ??? –

관련 문제