안녕하세요
mssql 쿼리문의 문의가 있어 글을 올리네요
아래 내용을 참고해 주세요 ^^
USE [test]
GO
CREATE TABLE [dbo].[TBL_TEST](
[id] [nvarchar](50) NULL,
[yyyy] [nvarchar](50) NULL,
[eng] [nvarchar](50) NULL,
[chn] [nvarchar](50) NULL,
[jpn] [nvarchar](50) NULL
) ON [PRIMARY]
GO
--전체 데이타
SELECT TOP (200) id, yyyy, eng, chn, jpn
FROM TBL_TEST
test1 | 2012 | NULL | a | |
test1 | 2011 | a | b | NULL |
test1 | 2010 | b | b | NULL |
test2 | 2012 | a | b | |
test2 | 2011 | NULL | b | |
test2 | 2010 | b | NULL | a |
--각 id별 최신 연도 하나에 해당하는 등급만 검색하고 싶은데
--아래 처럼 하면 영어 등급이 b인것이 최신 것 하나만 대상으로 검색하는것이 아니라
--전부 검색되서 나옵니다.
SELECT TOP (200) id, yyyy, eng, chn, jpn
FROM TBL_TEST
WHERE (eng LIKE '%b%')
--추출 아이디 test1, test2
test1 | 2010 | b | b | NULL |
test2 | 2010 | b | NULL | a |
--원하는 결과값은
--추출 아이디 test2 입니다.
아시는 분들의 조언 좀 부탁드립니다.
추가설명)
최신년도에 값이 없을때도 있어서요
Select top 1 id from tbl_test where eng like '%b%' order by yyyy desc
등급이 있는 년도 중 최근 연도 한개 중에서 등급을 검색해야 합니다 설명을 잘 했나 모르겠네요
Comment 7
-
Terry
2015.09.22 11:19
-
제시카
2015.09.22 20:42
두개 결과가 나온것이 잘못된거고 한개가 원하는 값입니다^^ 감사합니다~
-
Terry
2015.09.23 08:48
And Exists 이후건은
조건에 부합되는건만 가지고 온다는 의미입니다.
저 구문상에 들어가는 쿼리문은
Where 조건절이 중요한형태구요.
Select 'x' <- 요 구문은 아무 의미없는게 맞습니다.
전 습관적으로 Exists 나 Not Exists 내의 Select 구문에서
'x' 를 쓰구요 ^^
그럼 즐거운 하루 되세요~
-
제시카
2015.09.23 21:52
친절한 설명 감사합니다^^ 수고하세요
-
minsouk
2015.09.23 11:26
하하하하.....
-
제시카
2015.09.23 21:51
큰 웃음 줬나보네 즐~
-
minsouk
2015.09.24 03:44
질문도 답변도 여러번 읽어봤는데 이해가 안가 포기하고 웃어버렸네요 기분 나쁘셨으면 죄송합니다. 어려운 문제 이네요. 답변 쿼리 자체가 이해 안간다는 소리는 아닙니다.
뭔가 이상한데요?
Where 조건절에 id에 대한 조건은 하나도 없이
단순히 eng like '%b%'
라고 해버리시면 -_-;;;
2가지가 다 결과로 나오는게 맞는데요?
eng,chn,jpn 의 3가지 언어에 대해
검색이 일어날테구..
아이디, 년도,과목명,등급
으로 테이블을 분리후
처리했습니다.
하기 쿼리 참조하세요..
원하시는 결과인지는 모르겠네요..
-----쿼리시작----
with TBL_TEST (id,yyyy,eng,chn,jpn) As
(
Select 'test1','2012','' ,NULL,'a' Union All
Select 'test1','2011','a','b' ,NULL Union All
Select 'test1','2010','b','b' ,NULL Union All
Select 'test2','2012','' ,'a' ,'b' Union All
Select 'test2','2011','' ,NULL,'b' Union All
Select 'test2','2010','b',NULL,'a'
)
,tbl2 (id,yyyy,name,grade) As
(
Select a.id
,a.yyyy
,'eng' As name
,a.eng As grade
From TBL_TEST a
Where ISNULL(a.eng,'') <> ''
Union All
Select a.id
,a.yyyy
,'chn' As name
,a.chn As grade
From TBL_TEST a
Where ISNULL(a.chn,'') <> ''
Union All
Select a.id
,a.yyyy
,'jpn' As name
,a.jpn As grade
From TBL_TEST a
Where ISNULL(a.jpn,'') <> ''
)
Select
a.id
,a.yyyy
,a.name
,a.grade
From tbl2 a
Where a.name = 'eng'
And a.grade = 'b'
And Exists
(
Select 'x'
From tbl2 b
Where a.id = b.id
And b.name = a.name
And b.yyyy = (
Select
Top 1 c.yyyy
From tbl2 c
Where c.id = b.id
And c.name = b.name
Order By c.yyyy Desc
)
And b.yyyy = a.yyyy
)
----쿼리끝----