2016-05-12 3 views
-2

Ich versuche, den Unterschiedswert von weniger als zwei Abfragen mit Oracle Abfrage, aber ich bekomme keine Ahnung, um es zu lösen.Abfrage, um den Differenzwert von zwei verschiedenen Abfragen zu erhalten Ergebnisse

Ich habe zwei verschiedene Spalten "Spalte1" und "Spalte2" in der Tabelle "Tabelle1".

Zuerst möchte ich die Summe von column1 Werte und zweiten möchte ich die Summe von column2 Werte - ich habe die Anfragen für diese

Drittens möchte ich den Unterschied von über zwei Ergebnisse - kann dies jemand helfen?

Abfrage 1:

select sum(a.column1) as sum1 
from table1 a 
where a.name = 'who' and a.id = '123' 
group by serialno, lastname 

Abfrage 2:

select sum(a.column2) as sum2 
from table1 a 
where a.name = 'who' and a.id = '123' 
group by serialno, lastname 
+1

Warum diese ORDER BY-Klauseln? Führt Oracle keinen Fehler auf? – jarlh

+1

Funktioniert 'sum (column1) - sum (column2)' nicht? – Aleksej

+0

funktioniert für sum (columm1) - sum (column2). danke – sangeetha

Antwort

1

Direkt query:

select 
    sum(a.column1) as sum1, 
    sum(a.column2) as sum2, 
    sum(a.column2) - sum(a.column1) as diff 
from table1 a; 

Beispiel:

SQL> insert into table1 values (1,10); 

1 row created. 

SQL> insert into table1 values (2,20); 

1 row created. 

SQL> select sum(a.column1) as sum1, sum(a.column2) as sum2, sum(a.column2)-sum(a.column1) as diff from table1 a; 

     SUM1  SUM2  DIFF 
---------- ---------- ---------- 
     3   30   27 
2

können Sie eine einzelne Abfrage verwenden, um alle drei Ergebnisse, die Sie benötigen ::

select sum(column1), 
     sum(column2), 
     sum(column1) - sum(column2) as diff, 
     serialno, 
     lastname 
from table1 a 
where a.name = 'who' and a.id = '123' 
group by serialno, lastname 
0

Do not wissen, warum Sie keine einzelne Abfrage verwenden, aber trotzdem

Sie können es tun, wie

select sum(a.column1) - sum(a.column2) as difference 
from table1 a 
where a.name = 'who' and a.id = '123' 
group by serialno, lastname 
1

In Ihrem Beispiel, wie sie von allen Responder gezeigt, die Sie nicht getrennte Abfragen benötigen, Sie können alles auf einmal machen.

Angenommen, Sie möchten den Unterschied zwischen der Summe von Spalte1 für einige Filterbedingungen, z. B. where a.id = '123', und anderen Filterbedingungen, z. B. where a.id = '456'. Dann könnten Sie die Summen in zwei unabhängigen Abfragen getrennt berechnen, wie Sie es getan haben. Dann verwenden Sie sie als Unterabfragen in einer übergeordneten Abfrage. Die Unterabfragen sollten genau eine Zeile und eine Spalte zurückgeben (wie es bei Ihren Abfragen der Fall ist), und sie müssen von runden Klammern umgeben sein. Wie so:

select (select sum(column1) from table1 where id = '123) - 
          (select sum(col1) from table1 where id = '456') from dual; 

(Normalerweise wählt man nicht von Dual - dieser Ausdruck, ohne „wählen“ und „von dual“, kann dazu verwendet werden, wo würden Sie normalerweise eine Nummer.)

HINWEIS: Diese Abbildung soll nur zeigen, wie "skalare Unterabfragen" überall dort verwendet werden können, wo Zahlen verwendet werden können. (Oder abhängig vom Datentyp: Skalare Unterabfragen, die ein Datum oder eine Zeichenfolge zurückgeben, können überall dort verwendet werden, wo ein Datum oder eine Zeichenfolge verwendet werden könnte). Das Beispiel, das ich gab, zieht Summen aus der gleichen Tabelle, ist ineffizient und kann besser mit Case-Ausdrücke durchgeführt werden. Wenn die Summen aus zwei verschiedenen Tabellen kämen, gäbe es keine solche "effizientere" Lösung. Sehen Sie die Diskussion mit Boneist in den Kommentaren unten.

+0

Sie würden nicht zwei separate Unterabfragen benötigen; Sie könnten dasselbe in einer einzelnen Abfrage mit einem Case-Ausdruck, z.'select sum (case wenn id = '123' dann column1 end) - sum (case wenn id = '456' dann column2 end) von table1 wo id in ('123', '456');' – Boneist

+0

Nun, vermute ich jemand würde das vorschlagen, wollte es aber nicht komplizierter machen als nötig, um das Konzept zu veranschaulichen. Sie konnten keine Case-Ausdrücke verwenden, wenn die Summen in Spalten in verschiedenen Tabellen waren. Der Punkt, den ich versuchte, war Skalare Unterabfragen und wie sie verwendet werden können. – mathguy

+0

Sie möchten vielleicht Ihre Antwort bearbeiten, um dies dann zu deaktivieren. Wenn die Säulen von verschiedenen Tischen kommen, ist das ein ganz anderer Fischkessel. Indem Sie dies dem OP vorschlagen (dessen Spalten aus einer einzigen Tabelle stammen), fördern Sie möglicherweise eine schlechtere Leistung (zwei Scans durch die Tabelle und nicht nur eine). – Boneist

Verwandte Themen