안녕하세요 mssql 쿼리 문의드립니다... 0 5 380

by 우고 [SQL Query] MSSQL [2021.11.05 16:01:31]


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'

 

by isNull [2021.11.05 16:47:38]
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

 


by 우고 [2021.11.05 17:41:28]

안녕하세요 isNull님! 답변 주셔서 감사합니다.

위의 데이터는 제가 따로 뺀 TEST용 테이블이고, 해당 테이블에서는 정상적으로 작동하는 것을 확인하였습니다 *^^*

다만.. ㅠㅠ 본 테이블에 적용하려고 보니 

field(숫자) 와 field(숫자)_state 가 전부 varchar, char 형식으로 되어있어 

일반적인 SUM으로는 개수를 구할 수가 없었습니다 ㅠ.ㅠ

(본 DB에 적용했을 때, 숫자 3이 아니라 110 이런 식으로 string을 이어붙인 것과 같은 결과가 나오네용..)

 

여기서 질문이 발생합니다.

1. 본 테이블에는 위에서 언급드린 컬럼 수보다 훨씬 더 많은 컬럼이 존재합니다만 (약 50개...ㅠㅠ)

보여주신 코드와 같이 컬럼 하나하나 모든 값들을 다 지정해주어야 하나요?

2. 본 테이블에서는 row가 계속 증가하는데, 1번과 동일한 맥락의 질문으로 

추가될 때마다 지정해줘야 하나요...???ㅠㅠ

3. 만약 varchar 등 string 형식일 시 COUNT를 사용하면 결과값이 나올 수 있나요?

 


by isNull [2021.11.05 18:01:59]

1. 컬럼을 생략 할 순 없습니다. 다 기술해주셔야 됩니다.
2. ROW는 증가해도 영향이 없습니다. 컬럼이 영향이 있는겁니다.
3. 형변환을 해서 숫자 타입으로 처리하시면 됩니다.
   EX) TO_NUMBER(), CASE FIELD1_STATE WHEN 'A' THEN 1 ELSE 0 END, SIGN(FIELD1_STATE),... 등등
   COUNT는 컬럼값이 0이라도 카운트는 잡힙니다.


by 우고 [2021.11.12 17:39:10]

답변이 늦었습니다! 좀 많이 무식한 방식으로... 어찌저찌 해결했네요 ㅎㅎ 

이렇게 했더니 클라이언트 쪽에서 확인했으니 이젠 다른 테이블 JOIN해서 보여달라고 바꿔달라는 요청이 왔네요.. ㅠㅠㅋㅋ 후... 감사합니다...!!!


by 마농 [2021.11.08 09:13:11]

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
;

 

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