누적 계산 쿼리 질문드립니다. 0 10 900

by 푸릉이 [Oracle 기초] [2017.06.13 14:32:11]


A 테이블

(코드하고 이름이 존재)
select 'A' code, 'bolt' name from dual union all
select 'B' , 'knife' name from dual union all
select 'C' , 'toy'  from dual

B 테이블 (이름하고 부서진 날짜만 있음 데이터가 무수히 많음)
name     broken_day
bolt        20170612
bolt        20160712
bolt        20120612
knife        20140101
knife        20140303

간략화했는데요
결과는 
code    name    총고장횟수     지난1년동안 고장횟수
A           bolt            3                             2    
B            knife         2                             0
C            toy            0                           0   (없어도 나와야합니다)

간단할것 같은데 머에 꼽혔는지 잘 안나오네요.
고맙습니다.

by 마농 [2017.06.13 16:22:39]
WITH a AS
(
SELECT 'A' code, 'bolt' name  FROM dual
UNION ALL SELECT 'B', 'knife' FROM dual
UNION ALL SELECT 'C', 'toy'   FROM dual
)
, b AS
(
SELECT 'bolt' name, '20170612' broken_day FROM dual
UNION ALL SELECT 'bolt' , '20160712' FROM dual
UNION ALL SELECT 'bolt' , '20120612' FROM dual
UNION ALL SELECT 'knife', '20140101' FROM dual
UNION ALL SELECT 'knife', '20140303' FROM dual
)
SELECT a.code
     , a.name
     , COUNT(b.name) cnt
     , COUNT(CASE WHEN broken_day >= TO_CHAR(ADD_MONTHS(sysdate, -12), 'yyyymmdd') THEN 1 END) cnt_1
  FROM a
     , b
 WHERE a.name = b.name(+)
 GROUP BY a.code, a.name
 ORDER BY a.code
;

 


by 푸릉이 [2017.06.13 21:35:40]

여러조건이 있지만 간략화된 위에 쿼리에서 제일밑하단쿼리에 where b.name  ='knife'

있으면 토이나 볼트가 안나오게 되더라구요. 어떻게든 0 으로 나오게 하고픈데 이게 어렵습니다 ㅠ 

안되는것같기도하고 ㅠ 개념을 잘못잡고있는건가요


by 잭키올 [2017.06.13 23:32:52]

COUNT 함수의 새로운 활용이군요..

잘 배우고 갑니다.


by 마농 [2017.06.13 23:44:50]

질문한 만큼 답변 드립니다. 질문에 없던 내용 추가하셨네요.

추가 질문이 부족하네요. 추가질문에 대한 결과물을 보여주세요.


by 푸릉이 [2017.06.14 08:45:26]

with a as
(
select 'A' code, 'bolt' name  from dual
union all select 'B', 'knife' from dual
union all select 'C', 'toy'   from dual
)
, b as
(
select 'bolt' name, '20170612' broken_day from dual
union all select 'bolt' , '20160712' from dual
union all select 'bolt' , '20120612' from dual
union all select 'knife', '20140101' from dual
union all select 'knife', '20140303' from dual
)
select a.code
     , a.name
     , COUNT(b.name) cnt
     , COUNT(case when broken_day >= TO_CHAR(ADD_MONTHS(sysdate, -12), 'yyyymmdd') then 1 end) cnt_1
  from a
     , b
 where a.name = b.name(+)
    and b.name = 'knife'
 group by a.code, a.name
 order by a.code
;

이렇게 하면  나이프만 나오는데  애초에 마농님이 올렸던 결과처럼 나오게 하고 싶습니다.
사실 이렇게 하면 아래 and b.name = 'knife'  가 의미가 없는데
그래도 처음 마농님이 보여주신 결과처럼 나오게 하려면 어떻게 해야할까요?


by 마농 [2017.06.14 09:57:10]

황당한 질문이네요.
불필요한 조건을 추가하고 조건 추가 전이랑 동일한 결과를 원한다??
조건을 빼세요.


by 푸릉이 [2017.06.14 11:57:11]

아 제가 코멘트로 추가한 and a.name = 'knife' 이런내용이 아니고 저도 헷갈리네요 

다시 코드보고 저녁때 질문 드리도록 하겠습니다 ㅠ


by 나그네 [2017.06.14 17:35:16]

마농님이 작성한 쿼리에 조건을 b.name(+) = 'knife'로 한 결과를 말하는거 같네요..


by 푸릉이 [2017.06.20 18:32:49]

네 아래 name(+) 이거 였네요 고맙습니다.


by 마농 [2017.06.20 22:04:13]

원하는 결과가 결국 동일한 결과가 아니었네요.
제가 생각한 "동일한"의 의미(수치까지 완전히 똑같은)와
질문자께서 생각하신 "동일한"의 의미(결과 레코드수가 동일한)가 서로 달랐네요.

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