쿼리1.
select ip_address
, sum(total_increment) as '총합'
, SUM(printer_increment) as '프린트'
, SUM(copy_increment) as '복사'
, SUM(fax_increment) as '팩스'
from device_counter
where created_date between '2012-01-01' and '2013-10-01'
group by ip_address
쿼리2.
select ip_address
, sum(a3_bnw_increment*2+a4_bnw_increment+a3_color_increment*2+a4_color_increment) as '총합'
, SUM(a3_bnw_print_increment*2+a4_bnw_print_increment+a3_color_print_increment*2+a4_color_print_increment) as '프린트'
, SUM(a3_bnw_copy_increment*2+a4_bnw_copy_increment+a3_color_copy_increment*2+a4_color_copy_increment) as '복사'
from device_usage
where create_date between '2012-01-01' and '2013-10-01'
group by ip_address
위의 쿼리1과 쿼리2를 통해서 아래와 같은 결과를 얻고 싶습니다. 어떤방법이있을까요.. 알려주세요
Comment 5
-
건우아빠
2013.10.30 01:05
-
PowerChobo
2013.10.30 09:46
union을 햇을 경우는 결과가 아래로 나오더군요..
select dc.ip_address
, sum(dc.total_increment) as '총합'
, sum(dc.printer_increment) as '프린트'
, sum(dc.copy_increment) as '복사'
, sum(dc.fax_increment) as '팩스'
, sum(du.a3_bnw_increment*2+du.a4_bnw_increment+du.a3_color_increment*2+du.a4_color_increment) as '총합'
, sum(du.a3_bnw_print_increment*2+du.a4_bnw_print_increment+du.a3_color_print_increment*2+du.a4_color_print_increment) as '프린트'
, sum(du.a3_bnw_copy_increment*2+du.a4_bnw_copy_increment+du.a3_color_copy_increment*2+du.a4_color_copy_increment) as '복사'
from device_counter as dc LEFT outer join device_usage as du
on dc.ip_address = du.ip_address
group by dc.ip_address
order by dc.ip_address
위와같이 Outer Join을 했는데 중복된 값들이 안없어져요 ㅠㅠ
-
건우아빠
2013.10.30 10:24
union 하신 다음의 그걸 다시 그룹바이로 sum 해주셔야 합니다.
outer 조인은 기준 테이블을 기준으로 조인이 됩니다. 그러므로 기준 테이블이 아닌 테이블에 더 자료가 많을때는
잘못된 데이타가 나오게 됩니다. 이 경우는 full join을 하셔야 할듯 하구요..
기준테이블에 ip주소가 100% 다 가지고 있다면 그대로 하셔도 되구요..
중복이 된다고 하셨는데 어떻게 중복이 되는지가 ...
기본 데이타와 나와야 할게 어떻게 나왔는지도 .. 말씀만 들어서는 안그려지네요..
-
PowerChobo
2013.10.30 11:44
select dc.*, isnull(du.총합,0) as 총합, isnull(du.프린트,0) as 프린트, isnull(du.복사,0) as 복사
, (isnull(dc.총합,0) - isnull(dc.팩스,0)) - isnull(du.총합,0)as '총합차-팩스(팩스)', isnull(dc.팩스,0) as 팩스
, isnull(dc.프린트,0) - ISNULL(du.프린트,0) as 프린트, ISNULL(dc.복사,0) - ISNULL(du.복사,0) as 복사
, CAST(du.총합 as Float)/CAST(dc.총합 as Float) * 100 as '사용자별사용량총합/기기출력량총합'
from (
select ip_address
, sum(total_increment) as '총합'
, sum(printer_increment) as '프린트'
, sum(copy_increment) as '복사'
, sum(fax_increment) as '팩스'
from device_counter
group by ip_address
)dc left outer join (
select ip_address
, sum(a3_bnw_increment*2+a4_bnw_increment+a3_color_increment*2+a4_color_increment) as '총합'
, sum(a3_bnw_print_increment*2+a4_bnw_print_increment+a3_color_print_increment*2+a4_color_print_increment) as '프린트'
, sum(a3_bnw_copy_increment*2+a4_bnw_copy_increment+a3_color_copy_increment*2+a4_color_copy_increment) as '복사'
from device_usage
group by ip_address
)du on dc.ip_address = du.ip_address감사합니다^^ 이렇게 문제를 해결했는데요!
위에 빨간 부분에서 만약에 du.총합 나 dc.총합 의 값이 0으로 들어오게 되면 어떻게 처리를 해야할지 모르겟네요..
-
건우아빠
2013.10.30 12:08
0 이 된다면 그 부분은 계산을 안하는 게 좋을듯 합니다.
(case when dc.총합 = 0 then null else dc.총합 end )
union ,join 둘다 가능합니다.
두 결과의 ip_address 가 다를수 있다면 full outer join을 거시면 되구요.
조인이 귀찮으시면 union 으로 붙인신 다음 group by 하시면 원하시는 결과를 얻으실수 잇습니다..