컬럼 그룹 및 같은 컬럼 연산 질문 0 11 157

by 열심열심 [2018.08.02 15:30:00]


안녕하세요. 

A B C D
user 261 571 404
user 251 563 404
user 251 564 404
user 252 565 404
user 253 566 404
user2 254 567 404
user2 255 568 404
user2 263 575 401
user2 265 581 401
user2 100 100 401

 

테이블이 있으면 b,c는 emp 테이블에 자주 나오는 상사 부하직원 같은 관계이고 D는 404 성공 401 실패 같은 개념입니다. 

user별 그룹으로 401갯수/404갯수와 B그룹별 401갯수/404갯수 구하고 싶은데 

쉽지 않네요. decode나 case로 decode(d, 401, count(*))를 해도 장애가 떨어지고.. 

 

by 아발란체 [2018.08.02 15:40:34]
WITH T AS (
    SELECT 'user' AS a, 261 AS b, 571 AS c, 404 AS d FROM DUAL
    UNION ALL SELECT 'user', 251, 563, 404 FROM DUAL
    UNION ALL SELECT 'user', 251, 564, 404 FROM DUAL
    UNION ALL SELECT 'user', 252, 565, 404 FROM DUAL
    UNION ALL SELECT 'user', 253, 566, 404 FROM DUAL
    UNION ALL SELECT 'user2', 254, 567, 404 FROM DUAL
    UNION ALL SELECT 'user2', 255, 568, 404 FROM DUAL
    UNION ALL SELECT 'user2', 255, 568, 404 FROM DUAL
    UNION ALL SELECT 'user2', 263, 575, 401 FROM DUAL
    UNION ALL SELECT 'user2', 265, 581, 401 FROM DUAL
    UNION ALL SELECT 'user2', 100, 100, 401 FROM DUAL
)
SELECT
    a, d, COUNT(*)
FROM 
    T
GROUP BY
    a, d

 

B속성 기준 그룹별 401/404

SELECT
    b, d, COUNT(*)
FROM 
    T
GROUP BY
    b, d

 

2개 합친다면

SELECT
    a, d, COUNT(*)
FROM 
    T
GROUP BY
    a, d
UNION ALL
SELECT
    b||'', d, COUNT(*)
FROM 
    T
GROUP BY
    b, d

 


by 열심열심 [2018.08.02 16:03:05]

 

user2 404 3
user2 401 3
user 404 5
261 404 1
252 404 1
251 404 2
253 404 1
254 404 1
263 401 1
265 401 1
255 404 2
100 401 1

 

그룹바이 2개 설정이 가능했었는데 왜 생각을 못했지.. 그런데 지금도 한컬럼에 404 401 있어서 연산을 하기 힘드네요. 


by 우리집아찌 [2018.08.02 15:48:09]

원하는 결과값은요?


by 열심열심 [2018.08.02 15:57:22]

 

 

유저별

user 261 571 404 100
user2 100 100 401 40

 

b컬럼 별 

user 251 563 404 100
user 251 564 404 100
user 252 565 404 100
user 261 571 404 100
user2 263 575 401 0

같이요 3컬럼 조인걸어서 나오는거라 

저는  count((decode(A, 404, 'succ'))) as a , count((decode(A, 401, 'fail'))) as b 이런식으로 하고 그룹바이로 진행 중인데 

좀 아닌거 같아서요. 저기서 a/a+b도 안먹혀서 함수 다시 다적어야되고.. 

 


by 우리집아찌 [2018.08.02 16:03:31]

위에 주신 샘플이랑 결과값이랑 맞나요?

5번째 컬럼은 뭔지 모르겠습니다. 

설명좀 부탁드릴께요.


by 열심열심 [2018.08.02 16:05:35]

5번째는 user별로 그룹바이 묶어서 401개수/(401+404)*100 한 값입니다. 


by 열심열심 [2018.08.02 16:06:40]

두번째 테이블도 2번째 컬럼 별로 묶어서  401개수/(401+404)*100 한 값입니다. 


by 우리집아찌 [2018.08.02 16:09:58]

USER 261 571 404  <= 이값은 어떻게 나오는것이지요.

주신 샘플에는 USER 로 그룹핑해도 데이터가 많은데요.


by 열심열심 [2018.08.02 16:16:26]

user별 그룹 시 BCD테이블 필요 없이 계산값만 나오면 되구

b컬럼 별 그룹쉬에도  b컬럼과 계산값만 나오면 됩니다. 

user별로 치면 유저 네임 같은 것 5개 그중 404가 5개고 401 0개라서 5/5+0 * 100 해서 100 나오는거구 

b는 251 2개 그중에 404 2개니 100% 263은 1개중 401 1개라서 0% 이런식입니다. 

 


by 우리집아찌 [2018.08.02 16:30:18]
-- 다음에는 정확한 샘플과 결과를 올려주세요.

WITH T (A,B,C,D) AS (
SELECT 'user' , 261 , 571 , 404 FROM DUAL UNION ALL
SELECT 'user' , 251 , 563 , 404 FROM DUAL UNION ALL
SELECT 'user' , 251 , 564 , 404 FROM DUAL UNION ALL
SELECT 'user' , 252 , 565 , 404 FROM DUAL UNION ALL
SELECT 'user' , 253 , 566 , 404 FROM DUAL UNION ALL
SELECT 'user2' , 254 , 567 , 404 FROM DUAL UNION ALL
SELECT 'user2' , 255 , 568 , 404 FROM DUAL UNION ALL
SELECT 'user2' , 263 , 575 , 401 FROM DUAL UNION ALL
SELECT 'user2' , 265 , 581 , 401 FROM DUAL UNION ALL
SELECT 'user2' , 100 , 100 , 401 FROM DUAL 
)
-- A 그룹별
SELECT A 
     , COUNT(DECODE(D,404,1)) / COUNT(*) * 100
  FROM T 
 GROUP BY A
 ORDER BY A

-- B 그룹별
SELECT B 
     , COUNT(DECODE(D,404,1)) / COUNT(*) * 100
  FROM T 
 GROUP BY B
 ORDER BY B

 


by 열심열심 [2018.08.02 16:36:45]

감사합니다. 복잡하게 했는데 항상 엄청 간략화 하시네요 대단하십니다. 

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