2016-08-28 22 views
5

Tôi đang cố gắng trừ 2 bí danh để tạo một bí danh khác nhưng đang nhận được lỗi "cột không xác định".Tạo bí danh sử dụng kết quả toán học của 2 bí danh khác

Đây là SQL của tôi:

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 

Về cơ bản, tôi muốn tạo một bí danh profit bằng cách trừ revenue từ expense. Lý do là tôi đang sử dụng datatables và muốn cột được sắp xếp. Tôi đã biết tôi có thể dễ dàng làm điều này với PHP.

Tôi làm cách nào để thực hiện việc này?

Chỉnh sửa - Tôi đã thử các câu trả lời bên dưới và nhận được lỗi "Mỗi bảng có nguồn gốc phải có bí danh" từ PHPStorm và lỗi cú pháp khi cố gắng chạy truy vấn.

Heres truy vấn mới:

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 

Trả lời

1

Chỉ cần quấn nó với một lựa chọn, sau đó các bí danh sẽ có sẵn để sử dụng tính toán học:

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

Giống như câu trả lời khác, nhận được lỗi - "mỗi bảng dẫn xuất phải có bí danh" – kjdion84

+0

@ kjdion84 Đăng truy vấn đầy đủ của bạn, tôi sẽ cho bạn biết những gì bạn đã làm sai. – sagi

+0

@ kjdion84 Bạn đang chọn 'O. 'trong truy vấn bên ngoài thay vì' T.Column> ', (id và tên), sửa lỗi đó và thử lại – sagi

2

Bạn cần phải đặt câu hỏi của bạn bên trong một subquery.

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 

Lưu ý:

Bạn chỉ có thể sử dụng bí danh cột trong GROUP BY, ORDER BY, or HAVING khoản.

SQL chuẩn không cho phép bạn tham chiếu đến một bí danh cột trong mệnh đề WHERE . Hạn chế này được áp dụng vì khi mã WHERE được thực hiện , giá trị cột có thể chưa được xác định là .

Reference

+0

Bắt lỗi - "mỗi bảng có nguồn gốc nên có bí danh" – kjdion84

+0

tôi đã sử dụng bí danh. Bạn đã thử truy vấn đầy đủ mà tôi đã đăng chưa? @ kjdion84 – 1000111

+0

Sự sắp xếp lại và báo giá bạn cung cấp đang nói về mệnh đề 'WHERE', OP hỏi về việc sử dụng các bí danh bên trong câu lệnh' SELECT'. – sagi

Các vấn đề liên quan