지역묶어서 db내용 가져올때 1 24 1,935

by db초보 [MySQL] mysql [2015.11.18 11:22:22]


번호 이름  나이  지역 
1      가  10대 서울 
2      나  20대 경기
3      다  30대 서울
4      가  10대 경기
5      나  20대 서울

db테이블 위에 처럼있습니다

서울,경기 지역에 동명인 가,나  한사람씩 있고, 서울지역에 다라는 사람이 있어서 총 5명이 있습니다

그런데 테이블이 밑에처럼 번호,이름,나이,지역 이런식으로 되어있습니다

어떻게 가져와야지 밑에처럼 데이터를 넣을 수 있나요??

그리고 asp에서 mysql사용하고 있습니다

번호  이름 나이      지역
1      가  10대  서울 경기 
2      나  20대  서울  경기 
3      다  30대  서울   
 

by 우리집아찌 [2015.11.18 11:31:36]
/* 답에만 맞추었습니다 */

WITH T AS (
SELECT 1 NO , '가' NM , '10대' YR , '서울' LOC FROM DUAL UNION ALL
SELECT 2 , '나' , '20대' , '경기' FROM DUAL UNION ALL
SELECT 3 , '다' , '30대' , '서울' FROM DUAL UNION ALL
SELECT 4 , '가' , '10대' , '경기' FROM DUAL UNION ALL
SELECT 5 , '나' , '20대' , '서울' FROM DUAL
)

SELECT MIN(NO)AS NO
     , NM
     , YR
     , LISTAGG(LOC,' ') WITHIN GROUP(ORDER BY LOC DESC) LOC
  FROM T
 GROUP BY NM , YR

 


by db초보 [2015.11.18 12:55:59]

제가 왕초보라서 그런데..

번호가 db 필드에서 no이고

이름 NM

나이 YR

지역LOC

테이블명이 DUAL

맞나요?

제가 확인할려고 하는데 오류가 나오네요..

그리고 asp에서 mysql사용하고 있습니다

 

 

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'T AS (
SELECT 1 aa , '가' bb , '10대' cc , '서울' dd FROM ab UNION ALL
SELEC' at line 1


by 마농 [2015.11.18 11:41:57]
SELECT @no := @no + 1 AS no
     , nm
     , yr
     , GROUP_CONCAT(loc, ' ' ORDER BY loc DESC) loc
  FROM t
     , (SELECT @no := 0) x
 GROUP BY nm, yr
;

 


by db초보 [2015.11.18 13:08:04]

아..죄송합니다.

표를 안해서 잘못 전달됬나보네요.

지역보시면

서울 경기 있을때 (지역 셀합쳐야되는데.  댓글쓸때 어떻게 합치는지 몰라서..)

그리고 asp에서 mysql사용하고 있습니다

 

지역  
서울 경기
서울 경기
서울  

 


by 마농 [2015.11.18 13:27:02]

(경기)만 있는 것, (강원, 부산, 대구) 있는것 표시는 어떻게 해야 할까요?

위에 처럼 표로 보여주세요.


by db초보 [2015.11.18 14:37:59]

Group by 해서 이름,나이(나이대별)이 같은걸 묶었는데.. 한칸마다 서울,경기 따로 넣는걸 못하겠어요..

SELECT aa, bb, cc, dd as 지역, dd as 지역1 했는데도 안되네요..

SELECT에 넣어야지 데이터가 들어가는걸로 알고있는데 안되네요.


by 마농 [2015.11.18 14:41:53]

물어본거에 대한 대답은 안하시고 엉뚱한 대답만...


by db초보 [2015.11.18 14:51:09]
번호 이름 나이 지역  
1 10 서울 경기
2 20 서울 경기
3 30 서울  

지역 맨윗줄 한줄만 셀합쳐지게 하고 밑에 서울,경기는 보이는거와 같이 나눠지게 만들고 싶습니다


by 마농 [2015.11.18 14:52:49]

음.....똑같은 대답 반복해달라는게 아닌데요???

(경기)만 있는 것, (강원, 부산, 대구) 있는것 표시는 어떻게 해야 할까요???


by db초보 [2015.11.18 14:59:26]
번호 이름 나이 지역
1 10 서울,경기
2 20 서울,경기
3 30 서울

소스대로 하면 데이터가 위에처럼 나옵니다.. 서울 경기가 한곳에 뭉쳐있습니다

저는 지역을 두셀로 나눠서 왼쪽에는 서울넣고 오른쪽에는 경기 데이터 넣고 싶습니다.


by 마농 [2015.11.18 15:09:20]

음... 제 질문이 어려웠나요?

위의 데이터 예시 말고 다른 예도 있을것 같아 질문드린거에요.

서울, 경기 외에 다른 지역도 있을 듯 하구요.

2개 지역 이상 나오는 자료도 존재하리라 생각됩니다.

ㅇㅣ런 데이터들을 어떻게 표현해야 할지 문의 드린거에요?


by db초보 [2015.11.18 15:17:54]

음..만일 3개 지역이 있다고 하면

번호 이름 나이 지역    
1 가가 10 서울 경기 강원
2 나나 20 서울 경기  
3 다다 30 서울    
4 라라 40   경기  
5 마마 50   경기 강원

지역 3개 예를 들어서 올렸어요.

이름 가가(동명인) 10대가 3명이 서울,경기,강원 지역에 살고 있고

이름 나나는 20대면서 2명이 서울,경기

다다는 30대면서 서울에만

라라는 40대면서 경기에만

마마는 50대면서 2명인데 각각 경기,강원에서 살고 있다는 예시에요..

제 설명이 부족하면 또 답변해주세요..

 


by 마농 [2015.11.18 15:20:12]
SELECT @no := @no + 1 AS no
     , nm
     , yr
     , MIN(CASE loc WHEN '서울' THEN loc END) 서울
     , MIN(CASE loc WHEN '경기' THEN loc END) 경기
     , MIN(CASE loc WHEN '강원' THEN loc END) 강원
  FROM (SELECT 1 no, '가' nm, '10대' yr, '서울' loc FROM dual
        UNION ALL SELECT 2, '나', '20대', '경기' FROM dual
        UNION ALL SELECT 3, '다', '30대', '서울' FROM dual
        UNION ALL SELECT 4, '가', '10대', '경기' FROM dual
        UNION ALL SELECT 5, '나', '20대', '서울' FROM dual
        ) t
     , (SELECT @no := 0) x
 GROUP BY nm, yr
;

 


by db초보 [2015.11.18 15:36:39]

답변 고맙습니다..

MIN도 쓰고 CASE도 쓰고.. 책에서 하나씩 배울때는 쉬웠는데 같이 응용하니 어렵네요..


by db초보 [2015.11.18 16:16:21]

갑자기 하나가 막혀서 질문 다시 할께요..

MIN(CASE loc WHEN '서울' THEN loc END) 서울

이줄을 보면 loc속성에서 '서울'에 해당하는것을 찾습니다

그런데 db에 지역들 종류가 많으면 일일이 저렇게 안하고 db에 있는 지역을 가져와야되는데..

MIN(CASE loc WHEN loc THEN loc END) 서울

이렇게 하니 결과가 이상하게 나오는데..  어떻게 수정해야되나요??


by 마농 [2015.11.18 16:18:12]
-- 컬럼명으로 이미 표시한 값을 다시 보여주는 것은 의미 없을 듯 하네요
-- COUNT 로 인원수를 보여준다면 더욱 의미있는 자료가 되겠네요.
SELECT @no := @no + 1 AS no
     , nm
     , yr
     , COUNT(CASE loc WHEN '서울' THEN 1 END) 서울
     , COUNT(CASE loc WHEN '경기' THEN 1 END) 경기
     , COUNT(CASE loc WHEN '강원' THEN 1 END) 강원
  FROM (SELECT 1 no, '가' nm, '10대' yr, '서울' loc FROM dual
        UNION ALL SELECT 2, '나', '20대', '경기' FROM dual
        UNION ALL SELECT 3, '다', '30대', '서울' FROM dual
        UNION ALL SELECT 4, '가', '10대', '경기' FROM dual
        UNION ALL SELECT 5, '나', '20대', '서울' FROM dual
        ) t
     , (SELECT @no := 0) x
 GROUP BY nm, yr
;

 


by 마농 [2015.11.18 16:20:52]

행을 열로 바꿀 때는 그 대상집합의 종류와 값을 미리 알고 해야 합니다.

그게 아니라면 동적쿼리를 이용해야 합니다.

동적쿼리란 쿼리문장을 동적으로 만들어내는 것을 의미합니다.


by db초보 [2015.11.18 17:08:42]

동적 검색해서 해봤는데.. 서울우선 검색이 되는지 확인해 봤는데 안되네요..

서울 되면 하나씩 늘려나갈려고 했는데..

SET @ee="where loc = '서울'";

SELECT @no := @no + 1 AS no
     , nm
     , yr
     , COUNT(CASE loc WHEN @ee THEN 1 END) 서울
     , COUNT(CASE loc WHEN @ee THEN 1 END) 경기
     , COUNT(CASE loc WHEN @ee THEN 1 END) 강원
  FROM (SELECT 1 no, '가' nm, '10대' yr, '서울' loc FROM dual
        UNION ALL SELECT 2, '나', '20대', '경기' FROM dual
        UNION ALL SELECT 3, '다', '30대', '서울' FROM dual
        UNION ALL SELECT 4, '가', '10대', '경기' FROM dual
        UNION ALL SELECT 5, '나', '20대', '서울' FROM dual
        ) t
     , (SELECT @no := 0) x
 GROUP BY nm, yr
;

by 마농 [2015.11.18 17:27:25]

SET @ee='서울';


by 마농 [2015.11.18 17:22:32]

사용하신 쿼리는 동적쿼리가 아니라 변수 사용 쿼리네요.

동적쿼리란 쿼리문장 자체가 하나의 스트링변수로 되어있고

해당 변수의 문장을 프로그래밍을 통해 완성시키는 것입니다.

다시 말해 동적쿼리는 쿼리 영역이 아닌 프로그램 영역입니다.


by db초보 [2015.11.19 09:55:42]

음..그럼

1. 배열 aa라고 지정해놓고 db에 있는 loc데이터를 가져와서 중복을 없애고 저장

2. '서울','경기''강원' 대신에 aa(i)해서 순서대로 데이터를 넣는다

이렇게 하면 되는건가요?

만일 이렇게 하는게 맞다면 loc데이터를 가져왔을때 중복을 없애고 저장하는 방법 좀 알려주세요~


by 마농 [2015.11.19 10:55:24]
SELECT DISTINCT loc FROM t ORDER BY loc;

 


by 마농 [2015.11.19 13:29:27]

비교문자값 '서울', 경기' 대신 변수를 사용할수는 있으나...

컬럼 타이틀 "서울", "경기" 에는 변수를 사용할 수가 없습니다.

즉 "서울"이라는 타이틀 대신 "지역1", "지역2" 식으로 표현해야 하겠지요.


by 이재현 [2015.11.20 16:47:02]

마농님 대단하심니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입