Sentencia Case en MySQL
Hay una tabla " tbl_transaction' con
id INT(11) Primary Key
action_type ENUM('Expense', 'Income')
action_heading VARCHAR (255)
action_amount FLOAT
¿Es posible obtener un resultado usando solo la consulta SQL que muestra todo el monto del gasto en la columna de Gasto Amt y el monto del ingreso en la columna de Ingreso Amt como:
ID Heading Income Amt Expense Amt
1 ABC 1000 -
2 XYZ - 2000
Estoy usando MySQL como base de datos. Y estoy tratando de usar la declaración del CASO.
Salud!
6 answers
Sí, algo como esto:
SELECT
id,
action_heading,
CASE
WHEN action_type = 'Income' THEN action_amount
ELSE NULL
END AS income_amt,
CASE
WHEN action_type = 'Expense' THEN action_amount
ELSE NULL
END AS expense_amt
FROM tbl_transaction;
Como han señalado otras respuestas, MySQL también tiene la función IF()
para hacer esto usando una sintaxis menos detallada. Generalmente intento evitar esto porque es una extensión específica de MySQL para SQL que generalmente no se admite en otros lugares. CASE
es SQL estándar y es mucho más portátil en diferentes motores de bases de datos, y prefiero escribir consultas portátiles tanto como sea posible, solo utilizando extensiones específicas del motor cuando la alternativa portátil es considerablemente más lento o menos conveniente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 23:47:56
MySQL también tiene IF()
:
SELECT
id, action_heading,
IF(action_type='Income',action_amount,0) income,
IF(action_type='Expense', action_amount, 0) expense
FROM tbl_transaction
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 07:59:15
Intenta usar IF(condition, value1, value2)
SELECT ID, HEADING,
IF(action_type='Income',action_amount,0) as Income,
IF(action_type='Expense',action_amount,0) as Expense
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 07:56:55
Esto debería funcionar:
select
id
,action_heading
,case when action_type='Income' then action_amount else 0 end
,case when action_type='Expense' then expense_amount else 0 end
from tbl_transaction
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 07:57:10
Otra cosa a tener en cuenta es que hay dos casos diferentes con MySQL: uno como el que @ cdhowie y otros describen aquí (y documentan aquí: http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case) y algo que se llama un CASO, pero tiene una sintaxis completamente diferente y una función completamente diferente, documentada aquí: https://dev.mysql.com/doc/refman/5.0/en/case.html
Invariablemente, primero uso uno cuando quiero el otro.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-03 17:52:01
Espero que esto le proporcione la solución correcta:
Sintaxis:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list]....
[ELSE statement_list]
END CASE
Aplicación:
select id, action_heading,
case when
action_type="Expense" then action_amount
else NULL
end as Expense_amt,
case when
action_type ="Income" then action_amount
else NULL
end as Income_amt
from tbl_transaction;
Aquí estoy usando la declaración CASE
ya que es más flexible que if-then-else
. Permite más de una rama. Y la instrucción CASE
es SQL estándar y funciona en la mayoría de las bases de datos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-18 02:26:07