order_code job_code order_quantity field1 field1_state field2 field2_state field3 field3_state
AAA 11 NULL 1 1 1 0 1 1
AAA 22 NULL 1 1 1 1 NULL NULL
AAA 33 NULL 1 1 1 0 1 0
안녕하십니까 MSSQL 초보 개발자입니다.. 제가 위와 같은 데이터를 가지고
각 job_code 기준으로 field1_state, field2_state, field3_state가 각각 1인 것의 합 (count_status) 과
field1, field2, field3이 NULL이 아닌 것의 합 (count_all) 을 구하여
job_code count_status count_all
11 2 3
22 2 2
33 1 3
이라는 결과값을 도출하고 싶은데 어떻게 짜야할 지 막막해서 도움을 요청드리고자 합니다 ㅠㅠ
아래는 짜다가 포기한 쿼리인데... 일단 job_code가 11인 것만이라도 구해보고 싶어서 발버둥 친 흔적인데
잘 안되네욥... ㅠㅠ 도움주시면 감사드리겠습니다.
-------------------------------------------------------
SELECT (SELECT COUNT(CASE WHEN field1_state = '1' THEN 1 END) FROM table_name WHERE job_code = '11') as 'field1_state' , (SELECT COUNT(CASE WHEN field2_state = '1' THEN 1 END) FROM table_name WHERE job_code = '11') as 'field2_state' , (SELECT COUNT(CASE WHEN field3_state = '1' THEN 1 END) FROM table_name WHERE job_code = '11') as 'field3_state' , (SELECT SUM(cnt) FROM (SELECT COUNT(CASE WHEN field1_state = '1' THEN 1 END) FROM table_name WHERE job_code = '11') UNION ALL (SELECT COUNT(CASE WHEN field2_state = '1' THEN 1 END) FROM table_name WHERE job_code = '11') UNION ALL (SELECT COUNT(CASE WHEN field3_state = '1' THEN 1 END) FROM table_name WHERE job_code = '11')) as 'count' FROM table_name WHERE job_code = '11'
WITH T AS ( SELECT 'AAA' AS ORDER_CODE , '11' AS JOB_CODE , NULL AS ORDER_QUANTITY , 1 AS FIELD1 , 1 AS FIELD1_STATE , 1 AS FIELD2 , 0 AS FIELD2_STATE , 1 AS FIELD3 , 1 AS FIELD3_STATE FROM DUAL UNION ALL SELECT 'AAA', '22', NULL, 1, 1, 1, 1, NULL, NULL FROM DUAL UNION ALL SELECT 'AAA', '33', NULL, 1, 1, 1, 0, 1 , 0 FROM DUAL ) SELECT JOB_CODE , SUM( ISNULL( FIELD1_STATE, 0 ) + ISNULL( FIELD2_STATE, 0 ) + ISNULL( FIELD3_STATE, 0 ) ) AS COUNT_STATUS , SUM( ISNULL( FIELD1, 0 ) + ISNULL( FIELD2, 0 ) + ISNULL( FIELD3, 0 ) ) AS COUNT_ALL FROM T WHERE 1 = 1 GROUP BY JOB_CODE
안녕하세요 isNull님! 답변 주셔서 감사합니다.
위의 데이터는 제가 따로 뺀 TEST용 테이블이고, 해당 테이블에서는 정상적으로 작동하는 것을 확인하였습니다 *^^*
다만.. ㅠㅠ 본 테이블에 적용하려고 보니
field(숫자) 와 field(숫자)_state 가 전부 varchar, char 형식으로 되어있어
일반적인 SUM으로는 개수를 구할 수가 없었습니다 ㅠ.ㅠ
(본 DB에 적용했을 때, 숫자 3이 아니라 110 이런 식으로 string을 이어붙인 것과 같은 결과가 나오네용..)
여기서 질문이 발생합니다.
1. 본 테이블에는 위에서 언급드린 컬럼 수보다 훨씬 더 많은 컬럼이 존재합니다만 (약 50개...ㅠㅠ)
보여주신 코드와 같이 컬럼 하나하나 모든 값들을 다 지정해주어야 하나요?
2. 본 테이블에서는 row가 계속 증가하는데, 1번과 동일한 맥락의 질문으로
추가될 때마다 지정해줘야 하나요...???ㅠㅠ
3. 만약 varchar 등 string 형식일 시 COUNT를 사용하면 결과값이 나올 수 있나요?
1. 컬럼 다 지정해 줘야 합니다.
2. with (union) 을 그대로 사용하라는 의미가 아닙니다.
- with (union) 은 쿼리 테스트 용도로 사용한 것 뿐입니다.
3. 문자 이어 붙여서 길이를 측정하는 방법
WITH table_name ( order_code, job_code, order_quantity , field1, field1_state , field2, field2_state , field3, field3_state ) AS ( SELECT 'AAA', '11', null, '1', '1', '1', '0', '1', '1' UNION ALL SELECT 'AAA', '22', null, '1', '1', '1', '1', null, null UNION ALL SELECT 'AAA', '33', null, '1', '1', '1', '0', '1', '0' ) SELECT order_code , job_code , LEN(REPLACE(CONCAT(field1, field2, field3), '0', '')) count_status , LEN(REPLACE(CONCAT(field1_state, field2_state, field3_state), '0', '')) count_all FROM table_name ;