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

有没有一种方法可以重用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程序中进行所有计算。

sdfor asked 2019-10-09T01:59:28Z
7个解决方案
71 votes

是的,您可以重用变量。 这是您的操作方式:

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文档:]

通常,永远不要为用户变量分配值,并且不要在同一条语句中读取该值。 您可能会得到预期的结果,但这不能保证。

rzetterberg answered 2019-10-09T01:59:59Z
47 votes

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

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (SELECT total_sale) as f1_percent
FROM sales s
Robert D answered 2019-10-09T02:00:23Z
12 votes

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

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
OMG Ponies answered 2019-10-09T02:00:46Z
6 votes

您可以使用子选择:

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;
AJ. answered 2019-10-09T02:01:10Z
4 votes

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

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的解决方案,但是我认为如果您需要更多的子查询,它将变得更加难以阅读。

kiw answered 2019-10-09T02:01:49Z
0 votes

我一直在测试以下内容,并且似乎一直都在工作,也许是有原因的,因为我已将变量@total_sales预先定义为值而不是字符串,并且在选择过程中未重新定义其类型 声明??

如果我执行以下操作

    set @total_sales = 0;

    SELECT 
       @total_sale := s.f1 + s.f2 as total_sale, 
      s.f1 / @total_sale as f1_percent
   FROM sales s
Lawrence Edel answered 2019-10-09T02:02:20Z
0 votes

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

具体来说,我正在使用MariaDB 10.1。

对于“简单”的事情,您可以执行罗伯特·D(Robert D)在他的评论中建议的操作:

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

如果将某种聚合函数与内部联接一起使用,则不能使用此方法,但是可以将此方法与内部联接方法结合使用,如下所示(NB VAT =“营业税” ...,NB以财务数据货币表示) 字段通常有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)不允许在FROM子句中嵌套。 但是,可以通过制作第一个View(列出了InvoiceNoSubtotal),然后制作一个引用第一个的第二个View来轻松解决。 在性能方面,我完全不知道这种双View布置。

mike rodent answered 2019-10-09T02:03:16Z
translate from https://stackoverflow.com:/questions/6085443/can-i-reuse-a-calculated-field-in-a-select-query