[MSSQL] 2000 VS 2005 : Group by, Max
2007. 11. 7. 16:29ㆍCoders
MSSQL 2000 과 2005 의 차이점... 이라기 보다는,
새로이 출시된 MSSQL 2005 에서는 가능하지만, 2000에서는 불가능(실행할 수 없는)한
코드에 대한 이야기이다.
아직까지 신제품인 2005 버전보다, 2000 버전을 사용하는 경우가 많으니, 이는 한번 살펴봄 직 하다.
(아니, 쿼리 자체가 전혀 사용될 만한 게 아닌가?)
SSMS 에서 다음 소스를 실행해 보자.
(SSMS : Sql Server Management Studio 의 약자. 누군가 계속 에스에스엠에스 라고 떠드는 것 보니, 이 약어는 기본적 소양인가 보다.)
문제는, 2005 에서는, 이에 대한 수행이 제대로 되지만,
2000 에서는 다음과 같은 오류를 뱉는다.
서버: 메시지 8120, 수준 16, 상태 1, 줄 4
'TBL_TEST.CODE' 열이 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다
새로이 출시된 MSSQL 2005 에서는 가능하지만, 2000에서는 불가능(실행할 수 없는)한
코드에 대한 이야기이다.
아직까지 신제품인 2005 버전보다, 2000 버전을 사용하는 경우가 많으니, 이는 한번 살펴봄 직 하다.
(아니, 쿼리 자체가 전혀 사용될 만한 게 아닌가?)
SSMS 에서 다음 소스를 실행해 보자.
(SSMS : Sql Server Management Studio 의 약자. 누군가 계속 에스에스엠에스 라고 떠드는 것 보니, 이 약어는 기본적 소양인가 보다.)
- CREATE TABLE TBL_TEST
- (
- CODE NVARCHAR(4),
- QT NUMERIC(17,0)
- )
- GO
- DECLARE @LOOP INT,
- @CODEPREFIX NVARCHAR(10),
- @CODE NVARCHAR(4)
- SET @LOOP = 1
- SET @CODEPREFIX = 'ABCDEFGHIJ'
- SET NOCOUNT ON
- WHILE @LOOP <= 100
- BEGIN
- SET @CODE = SUBSTRING(@CODEPREFIX, @LOOP % 10 + 1, 1) +
- RIGHT(REPLICATE('0', 3) + CAST(@LOOP AS NVARCHAR), 3)
- INSERT TBL_TEST(CODE, QT)
- VALUES ( @CODE, CAST(RAND() * 1000000 AS NUMERIC(17,0)) )
- SET @LOOP = @LOOP + 1
- END
- SET NOCOUNT OFF
- /* ① 시작코드별로 GROUPING, SUM, 나머지 자리의 MAX 값 조회 */
- /* MS-SQL 2000 / 2005 에서 둘 다 실행 가능 */
- SELECT LEFT(CODE, 1) AS CODE_PREFIX,
- MAX(RIGHT(CODE, 3)) AS MAX_POSTFIX,
- SUM(ISNULL(QT, 0)) AS QT_SUM
- FROM TBL_TEST
- GROUP BY LEFT(CODE, 1)
- ORDER BY LEFT(CODE, 1)
- GO
- /* ② 시작코드별로 GROUPING, SUM, 가장큰 코드값 조회 */
- /* MS-SQL 2000 에서 실행 불가능, 2005 에서는 실행 가능 */
- SELECT LEFT(CODE, 1) AS CODE_PREFIX,
- LEFT(CODE, 1) + MAX(RIGHT(CODE, 3)) AS MAX_CODE,
- SUM(ISNULL(QT, 0)) AS QT_SUM
- FROM TBL_TEST
- GROUP BY LEFT(CODE, 1)
- ORDER BY LEFT(CODE, 1)
- GO
- /* ③ 2000에서 실행되지 않는 ②의 쿼리를 실행시키는 INLINE VIEW */
- /* MS-SQL 2000 / 2005 에서 둘 다 실행 가능 */
- SELECT CODE_PREFIX,
- CODE_PREFIX + MAX_POSTFIX AS MAX_CODE,
- QT_SUM
- FROM (
- SELECT LEFT(CODE, 1) AS CODE_PREFIX,
- MAX(RIGHT(CODE, 3)) AS MAX_POSTFIX,
- SUM(ISNULL(QT, 0)) AS QT_SUM
- FROM TBL_TEST
- GROUP BY LEFT(CODE, 1)
- ) AS FOR_2000
- ORDER BY CODE_PREFIX
- GO
- DROP TABLE TBL_TEST
- GO
대충, 중간의 쿼리문은, 임시 테이블에 데이터를 채우는 것이니까 자세한 설명은 패스.
중요한 부분은 ② 의 다음 코드이다.
LEFT(CODE, 1) + MAX(RIGHT(CODE, 3))
문제는, 2005 에서는, 이에 대한 수행이 제대로 되지만,
2000 에서는 다음과 같은 오류를 뱉는다.
서버: 메시지 8120, 수준 16, 상태 1, 줄 4
'TBL_TEST.CODE' 열이 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다
이는 2000 버전이 멍청하다거나, 또는 2005 버전이 훨씬 좋아졌네를 말하고자 하는 것이 아니다.
그런 말도 있지 않은가 "틀린 것이 아닙니다. 다른 겁니다." ㅎㅎ
결과처리의 순서가 다르다고 볼 수 있겠다... 라기 보다는 연산에 관련된 문제인데,
뭐냐하면, GROUP 값과, MAX 값의 문자열을 더하는(Concatenation) 연산에서 앞 쪽의 GROUPING 대상 때문에 뒤쪽의 값 까지 영향을 받아 같은 GROUP BY 절에 없다고 뭐라 하는 것이다.
즉, 이상이 없던 2005 버전에서는, 각기 개별의 연산(GROUPING 과 MAX)을 실행한 후에 문자열을 더하고 있고, 2000 버전에서는 GROUPING 과 MAX 연산 이전에 문자열을 더하려고 하는???
시바, 잘 모르겠다.
아무튼, 저대로 실행된다. ( 2000에선 안된다고 하는 건 안된다고 나오고, 뭐 그렇다는 얘기...)
'Coders' 카테고리의 다른 글
Generic Syntax Highlighter 를 tistory 에 적용해보자 (0) | 2007.11.07 |
---|---|
[MFC] 다른 클래스의 포인터 얻기(VC++) (0) | 2007.05.02 |
[MFC] Visual C++ 6.0 에서 Windows XP 스타일 버튼 만들기. (0) | 2007.05.01 |