2012-08-29 9 views
2

저는 초급자입니다 (DBA 아님). 내 데이터의 간단한 버전은 ==> 내 결과를 기대 : 나는 (B1, B2, 등) 각 공을 집계 할SUM, WHERE, GROUP_BY를 사용하는 MySQL 하위 쿼리

|ball |color|count|   |ball |Total Blue|Total Red| 
-------------------   ---------------------------- 
|b1 |red | 2 | ====> |b1 | 5  | 2  | 
|b1 |blue | 3 |   |b2 | 3  | 1  | 
|b1 |blue | 2 |   
|b2 |red | 1 |    
|b2 |blue | 3 | 

. 그런 다음 각 공에 대한 각 색상의 전체 인스턴스입니다. 각 공의 각 색상에 대한 항목이 있습니다 (실제 데이터에서). 하지만 여기 파란색 # 1 볼에 대해서만 여러 항목을 표시합니다.

내가 쉽게이 작업을 수행 할 수 있습니다

SELECT ball, 
SUM(count) AS 'Total Blue' 
FROM t1 
WHERE color = 'blue' 
GROUP BY ball 

가 첫 번째 (좋은) 결과를 얻으려면 :

 
|ball |Total Blue| 
----------------- 
|b1 | 5  | 
|b2 | 3  |

더 나아가하려면, 난 하위 쿼리를 필요가 있다고 생각합니다. 그러나 하위 쿼리를 일반 쿼리와 같은 방식으로 처리 할 수 ​​없었습니다.

|ball |Total Blue| Total Red| 
--------------------------- 
|b1 | 5  | 3  | 
|b2 | 3  | 3  |

총 빨간 공에 관계없이 모두 빨간 공의 총을 보여줍니다 :이 얻을

SELECT ball, 
SUM(count) AS 'Total Blue', 
(SELECT SUM(count) FROM t1 WHERE color = 'red') AS 'Total Red' 
FROM t1 
WHERE color = 'blue' 
GROUP BY ball 

: 아래

는 내가 지금까지 들어 왔 가장 가까운 결과 (단순 시도)입니다 번호. 나는 더 추가 된 영향이 하위 쿼리에 의해 GROUP 추가 한

(SELECT SUM(cc) FROM 
(SELECT DISTINCT count AS cc FROM t1 WHERE color = 'red') AS dd) 
AS 'Total Red' 

:

(적색)이 더 복잡 하위 쿼리는 동일한 결과를 생성합니다. 이것은 내가 얻을 수 있었던만큼 가깝습니다. 다른 많은 시도에서 다양한 결과가 있습니다.

답변

9

것은 SUM과 결합 해보십시오 경우 : 난 그냥 CASE 표준 SQL 있기 때문에, 다음을 제공 할 및 IF는 아니다

SELECT 
    ball, 
    SUM(IF(color = 'blue', count, 0)) AS 'Total Blue' 
    SUM(IF(color = 'red', count, 0)) AS 'Total Red' 
FROM t1 
GROUP BY ball 
+0

Wow that worked .... 너는 신이다 .... 나는 stackoverflow가 여기 앉아있는 것을 알고, 이것에 대해 며칠을 보냈다 .... 고마워! –

2

:

select ball, 
     sum(case when color = 'blue' then `count` else 0 end) as TotalBlue, 
     sum(case when color = 'red' then `count` else 0 end) as TotalRed 
from t 
group by ball 
order by 1 

또한, 같은 "수"를 가진 열의 이름은 SQL 예약어이기 때문에 나쁜 생각입니다.

+0

'COUNT'는 MySQL에서 [예약어] (http://dev.mysql.com/doc/refman/5.6/en/reserved-words.html)가 아니지만 [집계 함수] (http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_count). –

+0

@ 마크 바이어. . . MySQL 예약어 목록에없는 것이 맞습니다. 그러나 COUNT는 찾을 수있는 모든 ANSI SQL 예약어 목록에 있습니다 (나는 확인할 수있는 표준이 없습니다). 나는 여전히 변수 이름에 그런 단어를 사용하는 것은 나쁜 생각이라고 생각한다. –