2012-05-22 5 views
4

의 난이 MySQL의 테이블이 있다고 가정하자SUM 다른 열은 같은 값이있는 열

id place_id area_mq n 
-- -------- ------- -- 
1 1    50 1 

2 2    90 1 
3 2    20 1 

4 3    10 1 
5 3    10 2 
6 3    10 3 

7 4    20 1 
8 4    20 2 

9 5    15 1 
10 5    25 1 

id 기본 키, 지역 ID에 대한 place_id 스탠드, area_mq입니다 MQ에서 장소의 면적입니다 .

나는이 규칙 area_mq의 합을 계산하는 컴팩트 한 쿼리를 찾을 수 있습니다 무엇을해야 : n이 같은 place_id에 대한 동일입니다

  • 경우, 다음에 대한 모든 area_mq (f.ex을 계산 place_id = 2, I는 012,334을 계산 한 다음,이 동일한 nplace_id위한 다른인 경우
  • ) 합계 90 20 카운트 (가능한 이러한 종류의 "장소"때문에 값이 동일합니다; f.ex. place_id = 4, 두 개의 20이 있습니다. 합이 20이고 40이 아닙니다.)

이 예제에서 정확한 합계는 50 + (90 + 20) + 10 + 20 + (15 + 25)입니다.

쿼리 (코드 또는 절차 없음)를 사용하여이를 수행 할 수 있습니까? n에 대한 요구 사항이 취소 된 경우 GROUP BY와 하위 쿼리를 사용하면 간단 할 것입니다. 그러나이 조건을 사용하면 방해가됩니다.

+0

당신이 원하는 N = 1 개 항상 n 값을 사용하는 것입니다 here을 테스트? – Manuel

+0

아니오 @ dragon112, 임의 일 수 있습니다. – Cranio

답변

6
select place_id, sum(area_sq)/count(distinct n) 
from your_table 
group by place_id; 

+0

그건 과장되어 매력처럼 작동합니다! 정말 고맙습니다. – Cranio

+0

n이 NULL이면 어떨까요? COUNT (DISTINCT)가 null 값을 제외한다는 것을 알게되었습니다. 내가 생각한 null 값이 1로 구문 분석되는 하위 쿼리가 있지만 더 좋은 아이디어가있을 수 있습니다. – Cranio

+0

Null은 계산되지 않습니다. 해결 방법으로, 합치기를 특별한 값으로 사용할 수 있습니다. 테스트 [here] (http://sqlfiddle.com/#!3/94001/1) –

0

귀하의 패턴에서 볼 수있는 것에서 모두 n = 1이 추가 되었습니까?

SELECT SUM((n = 1) * area_mq) AS total 
FROM table_name 

1 또는 0을 반환하는 유효성 검사를 한 다음이 값에 열 값을 곱합니다.

+0

아니요, 죄송합니다, 여기 n은 단순성을 위해 점진적이지만 임의의 값일 수 있습니다. – Cranio

0

나는 이런 식으로 사용할 수 있다고 생각합니다. 카운트N의, 또한 최대 및 을 (아마도 과잉) 가지고; 이 값을 사용하여 n의 모든 값이 같은지 알아 내십시오. 이러한 맥락 :

SELECT 
    CASE WHEN sm/cnt = mn AND sm/cnt = mx THEN sum_area 
    ELSE area/cnt END 
    AS sum_area 
FROM (
    SELECT COUNT(n) cnt, SUM(n) sm, MIN(n) mn, MAX(n) mx, SUM(area_mq) sum_area 
    GROUP BY place_id 
) a 

따라서, N = 2,2> SM/CNT = MN (4/2 = 2), MX의 값이 말한다. 값이 2와 1 => sm/cnt! = mn (3/2! = 1)이면.