OS : Microsoft Windows 2000 Server / Advanced Server
SQL : Microsoft SQL Server 2000 Standard / Enterprise Edition
TBL_ITEM
[ITEM_NO],[NAME]
1 사과
2 레몬
3 딸기
TBL_MENU
[MENU_CD],[PRICE_CD]
1 A
1 B
2 A
2 B
2 C
3 B
3 C
TBL_PRICE
[PRICE_CD],[PRICE]
A 1000
B 2000
C 3000
이런식의 데이타에서
가져와서 여러개를
사과,(1000,2000)
레몬,(1000,2000,3000)
딸기,(2000,3000)
이렇게 콤마로 보여줘야 하는데
잘안되네요 ㅠㅠ 도움좀..주시면 고맙겟습니다.
테이블구조를 바꾸면 좋겟지만..부득이하기때문에...초보라....
기타
MS SQL 쿼리 질문.. -ㅅ-;;
2009년 8월에 작성된 글입니다. 17년 전 정보라 제품, 가격, 링크가 지금과 다를 수 있습니다.
이전 댓글 7
단순히 쿼리 결과값의 필드구분을 콤마로 하기 위함이신가요?그거라면 SELECT field_name1 + ',' + field_name2 FROM table_name where...이렇게 하시면 될것같은데질문의 요지가 이건 아닌것 같기도 하고 ^^
으음. 결과를 세로 형태가 아닌 가로 형태로 보여주는게 포인트인가 보네용. :)
오라클의 경우라면 SYS_CONNECT_BY_PATH로 대충 해결하면 될듯 한데 말입죠.mssql은 써본지가 너무 오래되서 ㅡ,.ㅡa 원하시는 결과를 뽑을수 있는건지 제대로 파악은 못했지만 혹시라도 참고하시라고 링크나 하나 걸어봅니다. http://www.cyworld.com/henry23/2558009
잠시 기둘려주세요....30분정도면 해결될듯합니다..ㅠ.ㅠ
1.일단 아래 테이블을 하나 생성합니다.(이것은 임시테이블로 바꾸셔도 됩니다.)CREATE TABLE TBL_TEMP( [TXT_VALUE] [varchar](4000) NULL) GO2. 아래 스크립트를 실행합니다.
SET NOCOUNT ONDECLARE testCursor SCROLL CURSORFOR SELECT TI.NAME, TP.PRICEFROM TBL_PRICE TP, TBL_MENU TM, TBL_ITEM TIWHERE TI.ITEM_NO=TM.MENU_CD AND TM.PRICE_CD=TP.PRICE_CD ORDER BY TI.NAME ASC , TP.PRICE ASCFOR READ ONLYOPEN testCursorDECLARE @NAME VARCHAR(50), @PRICE varchar(100), @TXT_VALUE VARCHAR(1000), @TMP_NAME VARCHAR(1000)FETCH FROM testCursor INTO @NAME, @PRICESELECT @TMP_NAME=''SELECT @TXT_VALUE=''DELETE TBL_TEMP
while @@FETCH_STATUS = 0BEGIN IF @TMP_NAME='' OR @TMP_NAME=@NAME BEGIN IF @TMP_NAME='' BEGIN SELECT @TXT_VALUE=@TXT_VALUE + @NAME +'(' + @PRICE SELECT @TMP_NAME=@NAME END ELSE BEGIN SELECT @TXT_VALUE=@TXT_VALUE+','+@PRICE SELECT @TMP_NAME=@NAME END END ELSE BEGIN INSERT INTO TBL_TEMP(TXT_VALUE) VALUES(@TXT_VALUE) SELECT @TMP_NAME='' SELECT @TXT_VALUE='' FETCH PRIOR FROM TESTCURSOR INTO @NAME,@PRICE END fetch from testCursor INTO @NAME,@PRICE END INSERT INTO TBL_TEMP(TXT_VALUE) VALUES(@TXT_VALUE) close testCursor deallocate testCursor select TXT_VALUE+')' from TBL_TEMPGo
사실 별거 없습니다.저기서 도입된 원리는 간단합니다.컬럼의 갯수가 다르면 일반적으로 단일쿼리로는 짜기가 힘듭니다.보통 이런 구조는 어플리케이션단에서 많이 만드는데...그냥 쿼리로만 만들다보니.....배열이나 변수대신 문자열 저장할 임시테이블을 만들고...커서를 이용해서 임시테이블 컬럼에 제어문을 통해서 insert 시킨후에....그 임시테이블에 레코드를 select 한것 뿐입니다.커서와 레코드셋 개념만 아시면 위의 내용은 걍 허접 코드일 뿐입니다만....단지 자주 쓰지 않아서.... 책을 좀 뒤적여야 하는 ...... 한참 헤맸다는......사실 위의 script는 transection 상에서 불안한 면이 많으니 실제 서비스 시에는 보완할 점이 많은 허접한 script 입니다.원하시면 허접 주석정도는 달아드릴수 있습니다.
와우...