Tengo una base de datos de productos con varias tablas para almacenar los precios (debido a los precios predeterminados y anulación opcional de precios por color del producto), y tengo declaraciones CASE en mi consulta para obtener el * Precio original del producto * Precio de venta de el producto, si está en ventaSentencia Postgresql CASE - ¿Puedo utilizar el valor devuelto de CASE dentro de mi SELECT?
También necesito calcular el DESCUENTO del producto si está a la venta. Antes de intentar esto, vea el desglose de mi SQL existente que funciona.
SELECT p.productid, p.stylename,
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price,
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price
FROM product p, ... etc.
funciona El código anterior (He simplificado ella), y, básicamente, el precio original del producto se almacena en el alias de columna "final_original_price", y el precio de venta (que podría ser NULL) se devuelve como "final_sale_price".
Ahora quiero agregar una línea adicional al SELECT para obtener el descuento. No puedo usar los campos existentes en la tabla actual porque quiero que los valores de retorno de "precio_origen_final" y "precio_venta_final" hagan los cálculos.
p. Ej.
SELECT p.productid, p.stylename,
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price,
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price,
((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage
FROM product p, ... etc.
Lo anterior no funciona, como PostgreSQL devuelve "ERROR: la columna 'final_original_price' no existe en el carácter ....."
Por lo tanto, es evidente que no se puede utilizar el valor de retorno de el caso. Mis preguntas sobre qué solución usar:
1) ¿Puedo usar el valor de retorno de la caja como quiero, arriba? O 2) ¿Debo volver a conectar la declaración de caso a mi cálculo? Eso significa que necesito repetir el código CASE y la consulta se verá bastante larga. Si tengo que hacerlo, haría esto, pero me pregunto si hay una mejor manera. O 3) También podría almacenar un campo adicional en la base de datos para almacenar el descuento. Esta información sería redundante porque mi CMS debería garantizar que el campo se actualice cada vez que se actualice el precio. Sin embargo, ahorraría cálculos pesados (si lo anterior se considera pesado) en la parte frontal, que corre mucho más a menudo que el servidor CMS.
Las soluciones anteriores son probablemente las más fáciles, pero también me pregunto, si tuviera tiempo para hacerlo, ¿hay alguna otra solución aquí que merezca la pena considerar? Por ejemplo, ¿serían buenos escenarios para escribir una "vista"? Personalmente, nunca he configurado una vista y, por lo que yo sé, el trabajo de selección de bases de datos todavía se realiza en segundo plano, pero, si se configura, haría que la consulta final sea más simple de entender desde el punto de vista de un desarrollador.
¡Muchas gracias!
Tenga en cuenta que su problema no tiene nada que ver con 'CASE'. Es un problema general de SQL como se puede ver en este ejemplo mínimo: 'SELECT 42 AS x, 12 AS y, x * y AS z'. Esto produce el mismo error. –