2016-10-13 4 views
5

私はhaving節に問題があります。私は、この出力を取得し、同じ入札が異なるSENSフィールド を有する二つの合計との比較したい:MySQL関連するクエリを持つ節が機能していません

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):フィールドのフィールド「v.bid不明

list`

編集:V1はビューです。エイリアスlとvを使用してサブクエリをメインクエリに追加しようとしています

ご迷惑をおかけしています。元のテーブルの列に問題がありました。今すぐ解決されました:)

+1

「V1」のスクリプトを投稿してください! - > 'CREATE VIEW v1 AS ...' ??? – sagi

答えて

5

この表から2つの選択のための必要はありません、あなたは、この目的のために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は表示されませんが、isnこのクエリを書くより直接的な方法はありませんか? – 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

ようこそStackOverflow。詳細を返信するのではなく、エラーを再現する必要があるので、ビューの宣言をそこに置くように質問を編集する必要があります。次に、あなたの答えで、あなたは実際に問題を指摘し、どのように解決するか(しかし、それらは問題に属する新しい詳細を紹介しません)。 –

+0

ありがとう、私はここに新しいので、再びごめんなさい:) – Lilo

+0

心配しないで、我々はすべて一日を学ばなければならなかった^^ –

関連する問題