我可以在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程序中做所有的计算。
是的,你可以重用variables。 这是你如何做到的:
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文档:]
作为一般规则,您不应该为用户variables赋值并在相同的语句中读取该值。 您可能会得到您所期望的结果,但这并不能保证。
以下似乎在我的MySQL 5.5testing中工作得很好:
SELECT s.f1 + s.f2 as total_sale, s.f1 / (SELECT total_sale) as f1_percent FROM sales s
只有跨平台支持的方法是使用派生表/内联视图:
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
你可以使用一个子select:
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;
您可以使用子查询,如下所示:
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的解决scheme,但是如果你需要更多的子查询,我认为它会变得更难阅读。
我一直在testing以下,似乎一直工作,也许有这个原因,是因为我已经预定义variables@total_sales作为一个值不是一个string,并没有重新定义其types在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
我看了这里的各种答案,做了一些实验。
具体来说,我正在使用MariaDB 10.1。
对于一个“简单”的事情,你可以做他的评论中罗伯特·D提出的build议:
SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items
如果您正在使用某种具有内部联接的集合函数,则不能使用此function,但是您可以将此方法与内部联接方法结合使用,如下所示(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
我想用上面的方式创build一个View
来列出他们的小计,增值税和总计发票…事实certificate,MariaDB(并且几乎可以肯定MySQL)不允许嵌套在FROM
子句中。 然而,这很容易解决,通过第一个View
列出InvoiceNo
和Subtotal
,然后作出第二个View
引用第一个。 在性能方面,我完全不知道这种双View
安排。