2011-08-16 37 views
5

Những gì tôi đang cố gắng làm là thêm một cột để tính toán (cr - dr)tái sử dụng bí danh trong CHỌN

Thấy như bạn không thể tái sử dụng một bí danh bên trong một mệnh đề SELECT, làm thế nào bạn sẽ đi về calculatin total

SELECT SUM(b.bet_win * cy.fx_rate)as dr, SUM(b.bet_loss * cy.fx_rate) as cr, cr+dr as total 
    FROM .... 
    WHERE .... 
+1

Thật đáng tiếc vì sytax được đề xuất của bạn là bất hợp pháp trong SQL tiêu chuẩn vì tính linh hoạt như vậy sẽ hữu ích. FWIW của bạn sẽ là cú pháp hợp lệ trong Access (ACE, Jet, bất cứ điều gì), tuy nhiên Access yêu cầu các biểu thức được đánh giá từ trái sang phải và thứ tự cột chỉ làm cho SQL thậm chí không linh hoạt hơn nó đã là: ( – onedaywhen

+0

có thể trùng lặp của [Có thể Tôi sử dụng lại trường được tính toán trong truy vấn SELECT?] (Http://stackoverflow.com/questions/6085443/can-i-resuse-a-calculated-field-in-a-select-query) –

Trả lời

9

Trong SQL server hoặc Oracle, tôi muốn sử dụng một CTE, nhưng kể từ khi bạn đang sử dụng MySQL, bạn muốn sử dụng một subquery:

SELECT dr, cr, cr + dr as total 
FROM (
    SELECT 
     SUM(b.bet_win * cy.fx_rate) as dr, 
     SUM(b.bet_loss * cy.fx_rate) as cr 
    FROM .... 
    WHERE ....) t; 
6

tôi không chắc chắn, nhưng không phải là sử dụng user variable nhanh hơn trong trường hợp này?

SELECT 
    @dr:=SUM(b.bet_win * cy.fx_rate), 
    @cr:=SUM(b.bet_loss * cy.fx_rate), 
    @[email protected] as total 
+3

Biến do người dùng xác định don Không hoạt động theo cách đó, ít nhất là trong MySQL.Giá trị của @dr và @cr không được đặt cho đến * sau * hàng đã được xử lý. Khi nó xây dựng hàng đầu tiên của tập kết quả @dr là NULL và @ cr là NULL, do đó 'total' là NULL. Sau đó @dr được đặt thành tổng số tiền thắng và @cr tổng số lỗ. Khi nó tạo hàng thứ hai và tính' tổng''dr và @cr có giá trị của Vì vậy, 'tổng số' sẽ là tổng số cho hàng trước đó – jtanium

+1

Wow, thực sự! Các biên tập viên hướng dẫn mysql nên đặt này ở đầu trang trong ste quảng cáo của rất nhiều sau này. Cảm ơn, jtanium, đã cho chúng tôi biết. –

1

Bạn có thể lặp lại các phép tính trong cột "tổng cộng".

SELECT 
    SUM(b.bet_win * cy.fx_rate) as dr, 
    SUM(b.bet_loss * cy.fx_rate) as cr, 
    SUM(b.bet_win * cy.fx_rate) + SUM(b.bet_loss * cy.fx_rate) as total 
FROM .... 
WHERE .... 
Các vấn đề liên quan