2012-04-16 2 views
1

나는이 쿼리로 머리를 쓰고있다.MySQL 중첩 SELECT

Date   Weight kg 
------------------- 
2012-04-16  12.4 
2012-04-17  9.6 
2012-04-16  5.4 
2012-04-18  2.8 
2012-04-16  4.5 
...    ... 

내가 쿼리는이 결과를 반환 할 : :이 같은 (간체)을 보이는 테이블이

Week.no. <3kg 3-7kg >7kg 
---------------------------- 
16   2.8 9.9 22.0 
...  ... ... .... 

이것은 내가 지금까지 무엇을 가지고 :

SELECT *, CONCAT(WEEK(`Date`)) AS Week, SUM(`Weight`) AS TotalWeight, 
    (SELECT SUM(`Weight`) FROM tbl_fangster WHERE `Weight` < 3 AND 
    `Date` >= '2012-04-01 00:00:00' AND `Date` <= '2012-04-30 00:00:00' 
    AND `Species` = 'Salmon') AS SumSmall 
FROM tbl_fangster 
WHERE `Date` >= '2012-04-01 00:00:00' 
AND `Date` <= '2012-04-30 00:00:00' 
AND `Species` = 'Salmon' 
GROUP BY CONCAT(WEEK(`Date`)) 

하지만 SumSmall은 매주 동일한 SumSmall 대신 SumSmall을 반환합니다. 하위 쿼리에 내 GROUP 절을 복사하려고했지만 작동하지 않았습니다.

+0

하위 쿼리는 해당주의 간격 만 지정해야합니다. –

+0

하위 쿼리는 컨테이너 쿼리의 필드에 종속되지 않으므로 매번 같은 값을 반환합니다. 하위 쿼리가 상위 쿼리의 필드를 사용하여 상관 관계가있는 상관 하위 쿼리를 원할 것입니다. http://en.wikipedia.org/wiki/Correlated_subquery –

답변

3

CASE 문을 사용하여 다양한 조건을 처리합니다.

SELECT *, CONCAT(WEEK(`Date`)) AS Week, SUM(`Weight`) AS TotalWeight, 
     SUM(CASE WHEN Weight < 3 THEN Weight ELSE 0 END) AS SumSmall, 
     SUM(CASE WHEN Weight >= 3 AND Weight <= 7 THEN Weight ELSE 0 END) AS SumMedium, 
     SUM(CASE WHEN Weight > 7 THEN Weight ELSE 0 END) AS SumLarge 
FROM tbl_fangster 
WHERE `Date` >= '2012-04-01 00:00:00' 
AND `Date` <= '2012-04-30 00:00:00' 
AND `Species` = 'Salmon' 
GROUP BY CONCAT(WEEK(`Date`)) 
+0

Joe, CASE 절이 존재했습니다. 나는 두시간 동안 머리카락을 찢어 버렸다. 평생 대머리에서 나를 구해 줬어! 감사! :디 – aanders77