database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 31361 게시물 읽기
No. 31361
특정 필드 기준으로 각 필드의 합을 구하는 방법
작성자
규야
작성일
2022-03-24 09:58
조회수
1,149

안녕하세요. 초보 입니다.


Table t 의 구조가

country, in , out, peer  필드가 있을때...

country 별 in, out 의 값을 합해서 보여주는 방법을 문의 드립니다



아래처럼 총 합을 구하는 SQL 구문은 잘 동작하고요.

select i.in , e.out , i.in + e.out

from

(

SELECT  sum(in)  AS in

from t

Where 

peer = true 

) as i

JOIN


SELECT  sum(out) As out

from  t

peer = false

) as e


하지만 country 별로 in , out 합을 구할때는 계속 에러가 납니다. 고수분들 조언 부탁 드립니다.

select country_case, i.in , e.out , i.in + e.out

from

(

SELECT  

case 

    when (country = "kr") then "kr"

    when (country = "us") then "us"

    else "others"

end as country_case,

sum(in)  AS in

from t

Where 

peer = true 

group by 1

) as i

JOIN


SELECT  

case 

    when (country = "kr") then "kr"

    when (country = "us") then "us"

    else "others"

end as country_case,

sum(out) As out

from  t

peer = false

group by 1 

) as e




 

이 글에 대한 댓글이 총 4건 있습니다.

위 글의 비번을 잊어서 아래와 같이 해보니 해결은 되었는데요. 너무 느리게 동작하는거 같습니다... 더 나은 방법이 있을까요?


select i.country_case,  in ,  out ,  in +  out

from

(

SELECT  

case 

    when (country = "kr") then "kr"

    when (country = "us") then "us"

    else "others"

end as country_case,

sum(in)  AS in

from t

Where 

peer = true 

group by 1

) as i

INNER JOIN  


SELECT  

case 

    when (country = "kr") then "kr"

    when (country = "us") then "us"

    else "others"

end as country_case,

sum(out) As out

from  t

Where

peer = false

group by 1 

) as e

ON i.country_case = e.country_case

규야님이 2022-03-24 10:46에 작성한 댓글입니다. Edit
전체 테이블을 스켄하기 때문에 1번만 스켄하도록 하는 것이 좋을듯 합니다.
SELECT country_case, SUM(in), SUM(out), SUM(in)+SUM(out)
FROM (
	SELECT 
		CASE WHEN country = 'kr' OR country = 'us' THEN country
		     ELSE 'others'
		END AS country_case
		,CASE WHEN peer=true THEN in END in
		,CASE WHEN peer=false THEN out END out
	FROM t
) 
GROUP BY 1
박인호(paerae)님이 2022-03-24 13:58에 작성한 댓글입니다.
MySQL 에서만 허용되는 표준에 어긋나는 구문들이 많이 있네요.
문자를 표현하는 따옴표는 홑따옴표 쓰셔야 하고
GROUP BY 1 이나 GROUP BY country_case 는 표쥰에 어긋납니다.
컬럼명에 in 등의 예약어를 쓸 수는 없습니다.
MySQL 에서 에러 안나니 사용해도 된다고 생각하기보다는
표준에 맞는 문법을 사용하시기를 권장합니다.

SELECT CASE WHEN country IN ('kr', 'us')
       THEN country ELSE 'others' END country_case
     , SUM(in_v)  in_v
     , SUM(out_v) out_v
     , SUM(in_v) + SUM(out_v) sum_v
  FROM t
 WHERE peer = true
 GROUP BY CASE WHEN country IN ('kr', 'us')
          THEN country ELSE 'others' END
;

 
마농(manon94)님이 2022-03-24 15:34에 작성한 댓글입니다.

두분 너무 감사드려요

특히 박인호님 덕분에 쿼리 하나로 만들 수 있었습니다

행복하세요

규야님이 2022-04-05 11:09에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
31367unixtime stamp 로 저장되어 있는 데이터 날짜 비교하기 [1]
규야
2022-04-11
1922
31366MYSQL 성능관련 문의
zzzz
2022-04-11
1205
31363두 개의 SELECT 결과를 비교하여 유일한 값을 가져오는 방법 [4]
김현석
2022-04-05
1143
31361특정 필드 기준으로 각 필드의 합을 구하는 방법 [4]
규야
2022-03-24
1149
31360필드내 구분자로 들어가 있는 데이터 select 하는 방법 문의 [4]
조현철
2022-02-27
1392
31359mysql with 버전 오류 문의 드립니다. [2]
정동호
2022-02-07
1489
31358구축한 웹사이트에서 mysql과 php 연동 문제 [2]
김길동
2022-01-28
1705
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.064초, 이곳 서비스는
	PostgreSQL v14.2로 자료를 관리합니다