mysql - unknown - ¿Puedo reutilizar un campo calculado en una consulta SELECCIONAR?
mysql update error 1054 (7)
Eché un vistazo a varias respuestas aquí e hice algunos experimentos.
Específicamente estoy usando MariaDB 10.1.
Por una cosa "simple" puedes hacer lo que Robert D sugirió en su comentario:
SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items
Si está utilizando algún tipo de función agregada con una unión interna, no puede usar esto, pero puede combinar este enfoque con el enfoque de unión interna de la siguiente manera (NB IVA = "impuesto a las ventas" ... y NB en la moneda de datos financieros campos suelen tener 4 lugares decimales, creo que es histórico ...)
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
Quería usar lo anterior para crear una View
para enumerar las facturas con sus subtotales, IVA y totales ... resultó que MariaDB (y casi con toda seguridad MySQL) no permite anidar en la cláusula FROM
. Sin embargo, esto se resuelve fácilmente haciendo una primera View
que enumera el InvoiceNo
y el Subtotal
, y luego haciendo una segunda View
que hace referencia a la primera. En cuanto al rendimiento, no tengo ni idea de este tipo de disposición de doble View
.
¿Hay alguna manera de reutilizar un campo calculado dentro de una declaración mysql? Me sale el error "total_sale de columna desconocida" para:
SELECT
s.f1 + s.f2 as total_sale,
s.f1 / total_sale as f1_percent
FROM sales s
o tengo que repetir el cálculo, lo que haría una declaración SQL muy larga si agrego todos los cálculos que necesito.
SELECT
s.f1 + s.f2 as total_sale,
s.f1 / (s.f1 + s.f2) as f1_percent
FROM sales s
por supuesto que puedo hacer todos los cálculos en mi programa php.
He estado probando lo siguiente y parece funcionar todo el tiempo, quizás haya una razón para esto, es porque he predefinido la variable @total_sales como un valor no una cadena, y no he redefinido su tipo durante la selección declaración ??
Si hago lo siguiente
set @total_sales = 0;
SELECT
@total_sale := s.f1 + s.f2 as total_sale,
s.f1 / @total_sale as f1_percent
FROM sales s
Lo siguiente parece funcionar bien en mis pruebas en MySQL 5.5:
SELECT
s.f1 + s.f2 as total_sale,
s.f1 / (SELECT total_sale) as f1_percent
FROM sales s
Puede utilizar una sub-selección:
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;
Puedes usar subconsultas, como esta:
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
Editar:
producto cartesiano fijo, asumiendo que la clave primaria es id
.
Esto debería ser equivalente a la solución de OMG Ponies después de la optimización, pero creo que será más difícil de leer si necesita más subconsultas.
Sí, puedes reutilizar variables. Así es como lo haces:
SELECT
@total_sale := s.f1 + s.f2 as total_sale,
s.f1 / @total_sale as f1_percent
FROM sales s
Lea más sobre esto aquí: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
[Nota: este comportamiento no está definido. Según los documentos de MySQL:]
Como regla general, nunca debe asignar un valor a una variable de usuario y leer el valor dentro de la misma declaración. Es posible que obtenga los resultados que espera, pero esto no está garantizado.
Solo se admiten medios multiplataforma utilizando una tabla derivada / vista en línea:
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