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!

Author: Pradip Kharbuja, 2013-03-07

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.

 123
Author: cdhowie,
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
 20
Author: Bart Friederichs,
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
 8
Author: Riho,
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
 2
Author: Dumitrescu Bogdan,
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.

 2
Author: nomadkbro,
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.

 0
Author: Sushmita Konar,
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