2016-10-13 4 views
5

Ich habe ein Problem in meiner Klausel zu haben. Ich möchte zwischen zwei Summe mit der gleichen Bid, aber unterschiedliche sens Felder ich diese Ausgabe erhalten vergleichen:MySQL Having-Klausel mit einer korrelierten Abfrage funktioniert nicht

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): Feld ‚v.bid unbekannt in Feld list`

Edit: V1 eine Ansicht ist, i-Aliase l verwendet und v versuchen, ling die Sub-Abfrage an die Hauptabfrage

Sorry Leute Ihnen allen für Ihre Antworten danken, ich ein Problem hatte wuth die Spalten der ursprünglichen Tabelle und jetzt ist es gelöst :)

+1

Geben Sie das Skript von 'V1' !! -> 'CREATE VIEW v1 AS ...' ??? – sagi

Antwort

5

Keine Notwendigkeit für zwei wählt aus dieser Tabelle können Sie CASE EXPRESSION für diesen Zweck verwenden:

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

Ich habe den gleichen Fehler :) – Lilo

+2

Das sollte nicht passieren: S Haben Sie eine Spalte "Gebot" in der Tabelle "v1"? @Bili – sagi

+2

@Bili Unwahrscheinlich, es sei denn, Sie haben kein Gebotsfeld in der Tabelle v1. – Shadow

3

Der Alias ​​in subselect ist nicht sichtbar/verfügbar so erhalten und Spalte gefunden Fehler nicht, aber Sie können Refaktorieren Queru diese Weise

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

der Alias ​​ist nicht sichtbar ja, aber isn 't eine direktere Art diese Anfrage zu schreiben ??? – Lilo

+0

@Bili. Entschuldigung, es gibt einen Fehler im Alias ​​.. Ich habe die Abfrage aktualisieren .. – scaisEdge

+0

@Bill für mich diese Art von Abfrage (mit aggregierten Funktion in Join sind eine leistungsfähige Möglichkeit für Filter und wählen Sie gemischten Wert (Aggregat und nicht Aggregat) aus verschiedenen auswählen Tabellen – scaisEdge

0

ich mit der Sichtbarkeit der Spalten ein Problem hatte, weil die Ansicht nicht richtig erklärt wurde, ich entschuldige mich Jungs: "(ich fühle mich wirklich schlecht :(

das Skript:

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

Willkommen bei StackOverflow. Anstatt mit den Details zu antworten, sollten Sie Ihre Frage bearbeiten, um die Deklaration der Ansicht dort zu platzieren, wie es notwendig ist, den Fehler zu reproduzieren, den Sie erhalten. Dann können Sie in Ihrer Antwort tatsächlich auf das Problem und die Lösung hinweisen (aber keine neuen Details einführen, die zu der Frage gehören). –

+0

Danke Mann, ich bin neu hier, es tut mir so leid :) – Lilo

+0

Keine Sorge, wir mussten alle eines Tages lernen ^^ –

Verwandte Themen