我可以在SELECT查询中重用计算字段吗?

时间:2011-05-22 01:18:06

标签: mysql sql mysql-error-1054

有没有办法在mysql语句中重用计算字段。我收到错误“unknown column total_sale”:

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / total_sale as f1_percent
FROM sales s

或者我是否必须重复计算,如果我添加了我需要的所有计算,这将产生一个非常长的SQL语句。

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (s.f1 + s.f2) as f1_percent
FROM sales s

当然我可以在我的php程序中完成所有计算。

7 个答案:

答案 0 :(得分:72)

是的,您可以重复使用变量。你就是这样做的:

SELECT 
    @total_sale := s.f1 + s.f2 as total_sale, 
    s.f1 / @total_sale as f1_percent
FROM sales s

在此处详细了解:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

[注意:此行为未定义。根据MySQL文档:]

  

作为一般规则,您不应该为用户变量赋值并在同一语句中读取值。您可能会得到您期望的结果,但这不能保证。

答案 1 :(得分:47)

以下似乎在我对MySQL 5.5的测试中运行良好:

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (SELECT total_sale) as f1_percent
FROM sales s

答案 2 :(得分:13)

只有跨平台支持的方法是使用派生表/内联视图:

SELECT x.total_sale,
       x.f1 / x.total_sale as f1_percent
  FROM (SELECT s.f1,
               s.f1 + s.f2 as total_sale, 
          FROM sales s) x

答案 3 :(得分:6)

您可以使用子选择:

select tbl1.total_sale,
       tbl1.f1/tbl1.total_sale as f1_percent 
  from (select s.f1+s.f2 AS total_sale, 
               s.f1 
          from sales s) as tbl1;

答案 4 :(得分:4)

您可以使用子查询,如下所示:

SELECT 
    h.total_sale, 
    s.f1 / h.total_sale AS f1_percent
FROM sales s,
    (SELECT id, f1 + f2 AS total_sale FROM sales) h
WHERE
    s.id = h.id

修改
固定的笛卡尔积,假设主键为id 这应该等同于优化后的OMG Ponies解决方案,但我认为如果你需要更多的子查询,它将变得更难阅读。

答案 5 :(得分:0)

我一直在测试以下内容并且它似乎一直都在工作,也许这是有原因的,是因为我已经将变量@total_sales预定义为不是字符串的值,并且没有重新定义其类型在select语句中??

如果我执行以下操作

    set @total_sales = 0;

    SELECT 
       @total_sale := s.f1 + s.f2 as total_sale, 
      s.f1 / @total_sale as f1_percent
   FROM sales s

答案 6 :(得分:0)

我在这里看了各种答案并做了一些实验。

具体来说我使用的是MariaDB 10.1。

对于一个“简单”的事情,你可以做罗伯特·D在评论中提出的建议:

SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items 

如果您使用某种内部联接的聚合函数,则不能使用此函数,但您可以将此方法与内部联接方法结合使用,如下所示(NB VAT =“销售税”...和NB in财务数据货币字段通常有4位小数,我认为这是历史性的......)

SELECT 
    invoices.invoiceNo, invoices.clientID, invoices.Date, invoices.Paid, 
  invoicesWithSubtotal.Subtotal,
  ROUND( CAST( Subtotal * invoices.VATRate AS DECIMAL( 10, 4 )), 2 ) AS VAT,
  (SELECT VAT + Subtotal) AS Total
FROM invoices 
    INNER JOIN 
    ( SELECT Sum( invoiceitems.Charge ) AS Subtotal, invoices.InvoiceNo FROM invoices 
        INNER JOIN invoiceitems ON invoices.InvoiceNo = invoiceitems.InvoiceNo
            GROUP BY invoices.InvoiceNo ) invoicesWithSubtotal
    ON invoices.InvoiceNo = invoicesWithSubtotal.InvoiceNo

我想使用上面的内容创建一个View来列出发票及其小计,增值税和总计......结果发现MariaDB(几乎可以肯定是MySQL)不允许在{{{ 1}}子句。但是,通过制作第一个列出FROMView的{​​{1}},然后制作引用第一个InvoiceNo的{​​{1}},可以轻松解决这个问题。表现方面我根本不知道这种双重Subtotal安排。