2016-08-28 2 views
5

Ich versuche, 2 Aliase zu subtrahieren, um einen anderen Alias ​​zu erstellen, bekomme aber einen Fehler "unbekannte Spalte".Erstellen eines Alias ​​mit mathematischen Ergebnissen von 2 anderen Aliasen

Hier ist meine SQL:

select o.id, o.name, 
    (select sum(l.source_expense) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `expense`, 
    (select sum(a.buyer_revenue) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.refunded=0 
     and a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `revenue`, 
    `revenue` - `expense` as `profit` 
    from {$this->sql_table} as o 

Grundsätzlich möchte ich eine profit alias erstellen, indem revenue von expense subtrahiert wird. Der Grund ist, dass ich Datatables verwende und die Spalte sortierbar sein soll. Ich weiß schon, dass ich das mit PHP leicht machen kann.

Wie kann ich das erreichen?

Bearbeiten - Ich habe versucht, die Antworten unten und bekomme eine "Jede abgeleitete Tabelle sollte Alias ​​haben" -Fehler von PHPStorm, und einen Syntaxfehler beim Versuch, die Abfrage auszuführen.

Heres die neue Abfrage:

select t.id, t.name, t.expense, t.revenue, t.revenue - t.expense as profit 
from(select o.id, o.name, 
    (select sum(l.source_expense) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `expense`, 
    (select sum(a.buyer_revenue) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.refunded=0 
     and a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `revenue` 
    from {$this->sql_table} as o 
) as t 

Antwort

1

einfach wickeln Sie es mit einer anderen wählen, dann wird die Aliase für die Verwendung von mathematischer Berechnung zur Verfügung:

SELECT t.id,o.name,t.expense,t.revenue, 
     t.revenue -t.expense as `profit` 
FROM (Your Query Here) t 
+0

Das gleiche wie andere Antwort, Fehler erhalten - "jede abgeleitete Tabelle sollte Alias ​​haben" – kjdion84

+0

@ kjdion84 Veröffentlichen Sie Ihre vollständige Abfrage, ich werde Ihnen sagen, was Sie falsch gemacht haben. – sagi

+0

@ kjdion84 Sie wählen 'O. 'in der äußeren Abfrage anstelle von' T.Column> ', (ID und Name), beheben Sie das und versuchen Sie es erneut – sagi

2

Sie benötigen eine Abfrage innerhalb einer Unterabfrage zu setzen.

SELECT 
t.*, 
t.`revenue` - t.`expense` as `profit` 
FROM 
(
select o.id, o.name, 
    (select sum(l.source_expense) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `expense`, 
    (select sum(a.buyer_revenue) 
     from `assignments` as a 
     left join `leads` as l on (l.id = a.lead_id) 
     where a.refunded=0 
     and a.{$this->sql_column}=o.id 
     and l.date_created between {$this->date_from} and {$this->date_to} 
     and find_in_set(l.vertical_id, '".implode(',', $this->app_user->verticals)."') 
    ) as `revenue` 
    from {$this->sql_table} as o 
) AS t 

Hinweis:

Sie nur Spaltenaliasnamen in GROUP BY, ORDER BY, or HAVING Klauseln verwenden können.

Standard-SQL ermöglicht es Ihnen nicht in einer WHERE-Klausel auf eine Spalte Alias ​​ zu verweisen. Diese Einschränkung wird auferlegt, denn wenn der WHERE-Code ausgeführt wird, darf der Spaltenwert noch nicht ermittelt werden.

Reference

+0

Fehler bekommen - „jede abgeleitete Tabelle sollte alias haben“ – kjdion84

+0

I‘ benutze Alias. Hast du die vollständige Abfrage, die ich gepostet habe, versucht? @ kjdion84 – 1000111

+0

Der Verweis und das Zitat, das Sie zur Verfügung gestellt haben, sprechen über die 'WHERE'-Klausel, das OP fragte nach der Verwendung der Aliase innerhalb der' SELECT'-Anweisung. – sagi

Verwandte Themen