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

by summer mssql [2024.01.03 10:00:09]


안녕하십니까 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() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입