2016-06-22 3 views
1

을 유지 여기에 질문 :이처럼 보이는 테이블이MySQL의 ORDER BY SUM, 그룹

+------+------+------+ 
| res | loc | rent | 
+------+------+------+ 
| WEB | WP | 100 | 
| WEB | VA | 300 | 
| VR | WP | 500 | 
| VR | VA | 200 | 
| VR | VA | 600 | 
| CS | WP | 400 | 
| CS | WP | 90 | 
+------+------+------+ 

(간체) 나는 LOC 테이블 SELECT 고해상도와 같이 얻을 수 , SUM (임대) FROM testTable GROUP BY res, loc; (총 임대료가 가장 큰이기 때문에)

+------+------+-----------+ 
| res | loc | SUM(rent) | 
+------+------+-----------+ 
| CS | WP |  490 | 
| VR | VA |  800 | 
| VR | WP |  500 | 
| WEB | VA |  300 | 
| WEB | WP |  100 | 
+------+------+-----------+ 

은 내가 여기에서 원하는 것은 첫째 VR로 테이블을 주문하는 것입니다, 다음 CS는, 다음, WEB 그러나 나는 또한 다음과 같을 것 때문에 그룹의 순서를 유지하려면

이렇게하면 위치별로 그룹화 된 다음 가장 큰 임대료 순으로 정렬 된 다음 해당 임대료 합계 내에서 임대료 순으로 정렬됩니다. VR은 800> 500이기 때문에 가장 큰 원인은 (800 + 500)> 490> (300 + 100)이고 VA는 WP보다 VR 그룹에옵니다.

너무 큽니까?

답변

0

당신은과 같이, 서브 쿼리에 별도로 고해상도 값의 합계를 계산해야합니다

SELECT t.res, t.loc, SUM(t.rent) AS reslocRent 
FROM table AS t 
INNER JOIN (
    SELECT res, SUM(rent) AS resRent 
    FROM table 
    GROUP BY res 
) AS subQ ON t.res = subQ.res 
GROUP BY t.res, t.loc 
ORDER BY subQ.resRent DESC, reslocRent DESC 
+0

엄청나게, 내가 원했던 덕분에. 그러나, 나는 내 질문에 대한 확장 된 부분을 가지고있다. 내가 LIMIT 2와 같은 것을 할 수 있고 상위 2 개의 res (VR과 CS)와 같은 테이블을 리턴 할 수 있는가? – Taylor

+1

하위 쿼리에 LIMIT 2를 추가하기 만하면 ** 내부 ** 조인으로 인해 상위 2 자릿수로 제한되어야하지만 모든 자국 합계를 계속 표시해야합니다. 리스트의 가장 높은 loc 만 원한다면, 전체 쿼리의 끝 부분에 한계 2를 놓으십시오. – Uueerdo

+0

위의 코멘트는 당신이 오직 ** 가장 높은 ** res_ – Uueerdo

0

모두 당신이 필요 내림차순으로 rent의 합 ORDER BY에있는 것처럼 보인다 :

SELECT res, loc, SUM(rent) 
FROM testTable 
GROUP BY res, loc 
ORDER BY SUM(rent) DESC