문자와 섞여있는 숫자를 분리해서 더하는 방법에 대해서 문의드립니다. 0 4 3,929

by summer mssql [2024.01.03 10:00:09]


예시.png (6,034Bytes)

안녕하십니까 DB를 이용하여 통계를 내려고하는 일반 직장인입니다. 
질문에 앞서 내용을 검색해봤는데 찾지를 못하겠어서 결국 질문을 드리게 되었습니다. 
첨부 그림과 같이 DB에서 쿼리를 보내면 제품명, 분류 코드로 구분이 됩니다. 

1226_FA01    2
1226_FB03    2
1226_FC08    2
1226_FD03    6
1226_FE02    6
1226_FF02    6
1226_FH04    2
1226_FG03    4

제품명은 생산날짜_영문순서 숫자(제품 개수)입니다. 
1226_FB03 을 예로 들면 분류 코드 2인 제품 3 종류가 1226_FB03 이라는 제품명을 부여받습니다.
분류 코드는 1~20까지 번호가 있습니다. (중간 중간 빠지는 번호도 있습니다!)

분류 코드로 구분을 한 후에 맨 뒤의 숫자를 모두 더하는 방식으로 집계를 할려면 어떻게 해야되는지
도움을 부탁드립니다. 

각 년도마다 집계를 해야하는데 위에 적은 내용을 기준으로 아래와 비슷한 결과물이 나오게
하고 싶습니다. 


년도 분류코드  카운트(분류코드)  제품뒤에 숫자 합산 
  22         2                4                       16

이 글을 읽으시는 분들께 너무 결과만을 바라보면서 답변을 구하는 점에 대해서 사과의 말씀을 드립니다.
업무가 아예 다르다보니 질문을 어떤 방향으로 해야할지도 잘 모르겠습니다.
(사실 전산 DB관련 담당자 퇴사 후 방치되고 있습니다.)
어떤 식으로 조회를 해야될지라도 알려주신다면 더 찾아보면서 결과물이 나오도록 노력하겠습니다. 
새해 복 많이 받으세요!!

by 마농 [2024.01.03 10:28:56]
WITH t AS
(
SELECT '2022' yy, '1226_FA01' nm, 2 cd  FROM dual
UNION ALL SELECT '2022', '1226_FB03', 2 FROM dual
UNION ALL SELECT '2022', '1226_FC08', 2 FROM dual
UNION ALL SELECT '2022', '1226_FD03', 6 FROM dual
UNION ALL SELECT '2022', '1226_FE02', 6 FROM dual
UNION ALL SELECT '2022', '1226_FF02', 6 FROM dual
UNION ALL SELECT '2022', '1226_FH04', 2 FROM dual
UNION ALL SELECT '2022', '1226_FG03', 4 FROM dual
)
SELECT yy
     , cd
     , COUNT(*) cnt_1
     , SUM(SUBSTR(nm, 8)) cnt_2
  FROM t
 WHERE yy = '2022'
 GROUP BY yy, cd
 ORDER BY yy, cd
;

 


by summer [2024.01.03 11:55:00]

안녕하세요! 마농님
답변 정말 감사드립니다. 
 

with t as
(select year(a.Time) as yy, a.Name as nm, a.Num as cd from Panel as a
union all
select year(b.Time), b.Name, b.Num from Panel as b)
select yy
	, cd
	, COUNT(*) as cnt_1
	, SUM(convert(integer,right(nm, 2))) as cnt_2
	from t
	where yy = '2022'
	group by yy, cd
	order by yy, cd

알려주신 대로 그대로 복붙했더니 dual 이랑 substr 을 사용할 수가 없다고 해서 알려주신 내용을 토대로 
변경을 해봤습니다.
몇 가지 추가 질문을 드리는데.. 혹시나 시간이 되신다면 알려주시면 감사드리겠습니다.!
with t as () 이거는 하나로 묶는 개념인가요?
(유니온과 위드를 검색해봤는데 잘 이해가 되지 않습니다.. ㅜㅜ)
substr 이 안되서 검색하다보니 제품명 뒤에 숫자가 01, 12, 23 이런 식으로 2자리라서 right 로 했습니다. 
(무슨 varchar 에러가 나길래 그대로 컨버트를 했더니 됐습니다!)
이렇게 고쳐서 나온 결과 값이 신뢰 할수 있는지 걱정반, 다른 부분에도 적용할수 있을 것 같아서 설렘반이긴합니다. 
고칠 부분이나 잘못된 부분이 있는지 지적해주시면 감사드리겠습니다. 
정말 고맙습니다!

앗 지금 조회를 하나만 해보니깐 수치가 2배로 나옵니다. 
union 부분을 삭제를 하면 될까요?


by 마농 [2024.01.03 12:45:40]

1. WITH 문은
- 올려주신 샘플 데이터를 만들기 위함 입니다.
- 직접 쿼리를 돌려보기 위한 용도로 사용한 것입니다.
2. DBMS 를 명시하지 않아서
- 오라클 기준으로 작성했습니다.
- 질문 시 DBMS 종류를 명시해 주셔야 합니다.
 

SELECT YEAR(Time) yy
     , Num
     , COUNT(*) cnt_1
     , SUM(CONVERT(INTEGER, RIGHT(Name, 2))) cnt_2
  FROM Panel
 WHERE YEAR(Time) = 2022
 GROUP BY YEAR(Time), Num
 ORDER BY yy, Num
;

 


by summer [2024.01.03 13:04:06]

아 넵 앞으로 참고하겠습니다. 쿼리문 정리해서 다시 올려주셔서 감사합니다. 

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