2016-10-13 8 views
5

내 having 절에 문제가 있습니다.MySQL 상관 쿼리가있는 Having 절이 작동하지 않습니다.

SELECT v.bid 
FROM v1 v 
WHERE sens = 'c' 
GROUP BY bid 
HAVING Sum(mont) < (SELECT Sum(l.mont) 
        FROM v1 l 
        WHERE sens = 'd' 
          AND l.bid = v.bid group by l.bid); 

ERROR 1054 (42S22) : 저도 같은 입찰하지만 다른 SENS 필드 내가이 출력을 얻을 갖는 2 개 개의 합 사이에 비교할 필드 '

list` 필드에 알 수없는 v.bid

편집 : V1은, 내가보기 별명 리터를 사용하고 V 링에

죄송합니다 사람이 귀하의 답변에 대한 여러분 모두 감사 주요 질의에 하위 쿼리를 시도하고, 나는이 문제가 발생되었다 원래 테이블의 열을 wuth 그리고 이제 해결되었습니다 :)

+1

'V1'의 스크립트를 게시하십시오 !! ->'CREATE VIEW v1 AS ... '??? – sagi

답변

5

이 테이블에서 두 가지 선택에 대한 필요, 당신은이 목적을 위해 CASE EXPRESSION을 사용할 수 없습니다 :

SELECT v.bid FROM v1 v 
GROUP BY v.bid 
HAVING SUM(CASE WHEN v.sens = 'c' THEN v.mont ELSE 0 END) < 
     SUM(CASE WHEN v.sens = 'd' THEN v.mont ELSE 0 END) 
    AND COUNT(CASE WHEN v.sens = 'c' THEN 1 END) > 0 
+0

나는 같은 오류가있어 :) – Lilo

+2

그런 일이 있어서는 안된다 : S'v1' 테이블에'bid' 열이 있습니까? @Bili – sagi

+2

@Bili v1 테이블에 입찰 필드가없는 경우가 아니면. – Shadow

3

부속의 별칭 가능/보이지 않는 그래서 당신은 얻을 수 및 열 오류를 찾을 수 없습니다하지만 당신은 리팩토링 할 수 있습니다 queru이 방법

select v.bid, t.tot 
     from v1 v 
    Join (
     select bid, sum(mont) tot 
     from v1 
     where sens = 'd' 
     group by bid 
     ) t on t.bid = v.bid 
    where v.sens = 'c' 
    and v.bid < tot 
+0

을 생성하는 SCRIPT는 보이지 않지만 yes가 아닙니다. 이 쿼리를 작성하는 좀 더 직접적인 방법 ??? – Lilo

+0

@Bili. 죄송합니다. 별칭에 오류가 있습니다 .. 쿼리를 업데이트했습니다 .. – scaisEdge

+0

@Bill이 종류의 쿼리 (조인에서 집계 된 함수를 사용하는 것은 필터와 혼합 값 (집계 및 집계 없음)을위한 강력한 방법입니다. 테이블 – scaisEdge

0
뷰가 잘못 선언했기 때문에 나는 컬럼의 가시성에 문제가 있고 있었다

, 난 사과의 사람은 '(난 정말 기분이 좋지 :( 스크립트 :

mysql> select * from op; 
+------+------+------+------+ 
| bid | cid | sens | mont | 
+------+------+------+------+ 
| 1 | 1 | c | 2000 | 
| 1 | 1 | c | 2000 | 
| 1 | 1 | c | 2000 | 
| 1 | 1 | c | 2000 | 
| 1 | 2 | c | 2000 | 
| 1 | 3 | c | 2000 | 
| 2 | 3 | c | 2000 | 
| 1 | 1 | d | 2000 | 
| 2 | 3 | d | 4000 | 
+------+------+------+------+ 
9 rows in set (0.00 sec) 


create view v1 as (select bid , cid , sens , sum(mont) as sumcli from op group by bid,cid,sens); 

mysql> select * from v1 ; 
+------+------+------+--------+ 
| bid | cid | sens | sumcli | 
+------+------+------+--------+ 
| 1 | 1 | c | 8000 | 
| 1 | 1 | d | 2000 | 
| 1 | 2 | c | 2000 | 
| 1 | 3 | c | 2000 | 
| 2 | 3 | c | 2000 | 
| 2 | 3 | d | 4000 | 
+------+------+------+--------+ 
6 rows in set (0.00 sec) 

mysql> SELECT v.bid 
    -> FROM v1 v 
    -> WHERE sens = 'c' 
    -> group by v.bid 
    -> HAVING Sum(v.sumcli) < (SELECT Sum(l.sumcli) 
    ->      FROM v1 l 
    ->      WHERE sens = 'd' 
    ->       AND l.bid = v.bid group by l.bid); 
+------+ 
| bid | 
+------+ 
| 2 | 
+------+ 
1 row in set (0.00 sec) 
+1

Welcome to StackOverflow. 세부 사항으로 회신하기보다는 오류를 재현 할 필요가 있기 때문에 질문을 편집하여보기 선언을 작성해야합니다. 그렇다면 답안에서 실제로 문제와 해결 방법을 지적 할 수 있습니다 (그러나 새로운 세부 사항을 소개하지는 않습니다). –

+0

고마워, 나는 여기에 너무 미안해서 다시 새어 졌어 :) – Lilo

+0

걱정 마, 우리 모두는 하루를 배워야했다 ^^ –