2016-05-28 3 views
0

subtrahieren sagen, dass ich eine Tabelle tableA und meine Frage istwie zwei resultierenden Werte in mysql

select id, 
     if(cond1, value, 0) firstval, 
     if(cond2, value, 0) secondval, 
     firstval-secondval diff 
from tableA 

Die obige Abfrage gibt Unknown column firstval in field list Fehler. Ich weiß, dass ich Diff als if(cond1, value, 0)-if(cond2, value, 0) diff berechnen kann, aber ich möchte Bedingung nicht wieder hinzufügen und ohne innere/sub-Abfragen.

EDIT: Meine abstrakte Idee folgt als

Tabellenstruktur

id | type | recorddate | value 
========================================= 
1   A  2015-12-17  9 
2   B  2015-12-19  5 
3   A  2016-01-13  31 
4   B  2016-01-14  23 
5   A  2016-01-31  44 
6   B  2016-02-07  38 

und so weiter ...

Abfrage:

select 
    type, 
    if(max(recorddate), value, 0) firstval, 
    if(secondmax(recorddate), value, 0) secndval, 
    firstval-secndval diff 
from table 
where month(recorddate)=1 
group by type with rollup 

Resultierende Tabelle oben basiert Abfrage:

type | firstval | secndval | diff 
====================================== 
A  44   31   13 
B  23   5   18 
Total 67   36   31   
+0

Was ist falsch bei der Verwendung von Unterabfragen? Warum willst du das nicht? Ansonsten glaube ich nicht, dass du es schaffen kannst. – mhawke

+0

Wenn es eine Unterabfrage gibt, können wir 'group by with rollup' nicht verwenden ... oder? – mpsbhat

+0

Vielleicht zeigen Sie uns das volle Problem? – splash58

Antwort

2

hinzufügen Unterabfrage

select *, firstval-secondval diff 
    from 
    (select id, if(cond1, value, 0) firstval, if(cond2, value, 0) secondval 
     from tableA 
    ) t 
0

Möchten Sie zwei resultierenden Werte subtrahieren erhalten. Habe ich recht?

Also für Firstval mit einer Bedingung zu überprüfen, wenn Bedingung wahr ist, dann erhalten Sie diesen Wert sonst Firstval Wert ist 0. Tun Sie dasselbe für Secondval auch. Damit erhalten Sie keinen unbekannten Spaltenfehler. Zuallererst sollten Sie den Spaltennamen firstval und secondval haben.

Select firstval-secondval as total from tableA; 

Es funktioniert für einfache subtrahieren.

Verwandte Themen