MS SQL 쿼리 질문.. -ㅅ-;;

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)
이렇게 콤마로 보여줘야 하는데

잘안되네요 ㅠㅠ 도움좀..주시면 고맙겟습니다.

테이블구조를 바꾸면 좋겟지만..부득이하기때문에...초보라....
이전 댓글 7
유리 2009-08-21 12:13
단순히 쿼리 결과값의 필드구분을 콤마로 하기 위함이신가요?그거라면 SELECT  field_name1 + ',' + field_name2  FROM table_name  where...이렇게 하시면 될것같은데질문의 요지가 이건 아닌것 같기도 하고 ^^
WinDOS 2009-08-21 13:45
으음. 결과를 세로 형태가 아닌 가로 형태로 보여주는게 포인트인가 보네용. :)
WinDOS 2009-08-21 14:38
오라클의 경우라면 SYS_CONNECT_BY_PATH로 대충 해결하면 될듯 한데 말입죠.mssql은 써본지가 너무 오래되서 ㅡ,.ㅡa 원하시는 결과를 뽑을수 있는건지 제대로 파악은 못했지만 혹시라도 참고하시라고 링크나 하나 걸어봅니다. http://www.cyworld.com/henry23/2558009
Ozzy 2009-08-21 16:09
잠시 기둘려주세요....30분정도면 해결될듯합니다..ㅠ.ㅠ
Ozzy 2009-08-21 16:33
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
Ozzy 2009-08-22 01:14
사실 별거 없습니다.저기서 도입된 원리는 간단합니다.컬럼의 갯수가 다르면 일반적으로 단일쿼리로는 짜기가 힘듭니다.보통 이런 구조는 어플리케이션단에서 많이 만드는데...그냥 쿼리로만 만들다보니.....배열이나 변수대신 문자열 저장할 임시테이블을 만들고...커서를 이용해서 임시테이블 컬럼에 제어문을 통해서 insert 시킨후에....그 임시테이블에 레코드를 select 한것 뿐입니다.커서와 레코드셋 개념만 아시면 위의 내용은 걍 허접 코드일 뿐입니다만....단지 자주 쓰지 않아서.... 책을 좀 뒤적여야 하는 ...... 한참 헤맸다는......사실 위의 script는 transection 상에서 불안한 면이 많으니 실제 서비스 시에는 보완할 점이 많은 허접한 script 입니다.원하시면 허접 주석정도는 달아드릴수 있습니다.
tsean 2009-08-27 23:11
와우...
← 질문답변 목록으로