有没有办法在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程序中完成所有计算。
答案 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}}子句。但是,通过制作第一个列出FROM
和View
的{{1}},然后制作引用第一个InvoiceNo
的{{1}},可以轻松解决这个问题。表现方面我根本不知道这种双重Subtotal
安排。