2014-11-17 11 views
2

나는 이렇게 트랜잭션 테이블을 가지고있다. 4 개의 필드 : time id type moneyMysql if-clause 시퀀스

유형 중 하나에는 3 개의 다른 하위 유형 (21,22,23)이 있으며 여기에서 ID를 기반으로 추가 유형을 작성한 다음 날짜 및 유형 당 돈을 계산합니다. 나는 그렇게하고있다.

select date(time), sum(money), 
case 
when type=2 and id<100 then type=21 
when type=2 and id between 100 and 499 then type=22 
when type=2 and id>=500 then type=23 
when type<>2 then type 
end as type 
from transactionsTable 
where type in (1,2,3,4,21,22,23) and date(time)>='2014-11-01' group by 1,3 

이상한 결과 중 하나는 type = 0을 얻었고, where 절 내에서 필터링했습니다. 두 번째 이상한 점은 내가 새로 만든 유형 21,22,23을 전혀 얻지 못한다는 것입니다!

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

+0

에서 결과를 포함하는 데에 유형을 참조 할 수 있습니다 결과 집합을 평가합니다. 그는 핵심 실수를 정확히 지적했다. 그럼에도 불구하고 나는 "유형"의 실수를 이해하지 못했다. – AVX

답변

2

어디에서나 같은 유형을 참조하거나 삽입 할 필요없이 유형을 설정할 수 없습니다. 당신이 할 수있는 일은이 쿼리의 결과를 사용하여 원하는 것을 반환하는 쿼리를 작성하는 것입니다.

SELECT DATE(time), SUM(money), 
     CASE 
      WHEN type=2 AND id<100 
       THEN 21 
      WHEN type=2 AND id BETWEEN 100 AND 499 
       THEN 22 
      WHEN type=2 AND id>=500 
       THEN 23 
      WHEN type<>2 
       THEN type 
     END AS type 
FROM transactionsTable 
GROUP BY 1,3 
HAVING type IN (1,2,3,4,21,22,23) AND DATE(time)>='2014-11-01' 

SIMPLIFIED FIDDLE DEMO

참고 : 절 재를 갖는 것은 그래서 당신은 당신의 쿼리 내가 존에 댓글을 달았습니다

+0

많은 감사 존! 그것은 당신이 쓴대로 잘 작동합니다. 한 가지 질문 만합니다. "21"과 "유형 = 21"의 차이점은 무엇입니까? 구문 오류가 아닙니다. 그렇지 않으면 오류가 발생했습니다. 그럼에도 불구하고 그 결과는 완전히 망했다. – AVX

+1

@ user3892041 type = 21이 (가) 과제를 수행하지 않습니다. 그래서 무엇을하는지는 부울 비교입니다.이 부울 비교는 타입이 2이기 때문에 항상 0 또는 false가 될 것입니다. 숫자를 넣으면 그 행에 대한 열의 값이 21이됩니다. '그것은 'type'이 21 인 열을 반환하기 때문에 다른 질의 나 HAVING 절에서 사용할 수 있습니다. –

+1

@ user3892041 type과 boolean 비교는 2이고 type은 21입니다. 거짓 이니 그래서 0을 반환합니다. 나는 당신에게 +1을주었습니다. 감사합니다. –