mysql - MySQL 中 SELECT 内的 IF 语句 SQL 查询

标签 mysql sql select stored-procedures group-by

我有以下工作正常的存储过程。

CREATE DEFINER=`root`@`localhost` PROCEDURE `TxCountByDatePerod`(IN `fromdate` DATE, IN `todate` DATE, IN `department` VARCHAR(20), IN `status` VARCHAR(10), IN `ipg` VARCHAR(20))
SELECT d.dept_name,
       s.service_name,
       COUNT(*) AS all_row_count
FROM department AS d
INNER JOIN service s ON s.dept_id=d.dept_id
INNER JOIN transaction_detail t ON s.dept_id=t.dept_id
AND s.service_id=t.service_id
WHERE t.tx_begin_date BETWEEN fromdate AND todate
  AND (t.dept_id = department
       OR department ='null')
  AND (t.tx_status = status
       OR status ='null')
  AND (t.pg_name = ipg
       OR ipg ='null')
GROUP BY t.dept_id,
         t.service_id

上述 SP 是用 MySQL 编写的,用于获取给定时间段内由特定部门的特定服务提供的事务数。一笔交易可以有3种不同的交易状态(tx_status coulmn),分别是完成(1)、失败(-1)、未完成(0)。

我要做的是获取以下报告的数据。

enter image description here

现在的问题是所有的状态都集中在一行中。我尝试了下面的 SQL 来根据需要获取数据,但它给出了语法不正确的错误。

CREATE DEFINER=`root`@`localhost` PROCEDURE `TxCountByDatePerod`(IN `fromdate` DATE, IN `todate` DATE, IN `department` VARCHAR(20), IN `status` VARCHAR(10), IN `ipg` VARCHAR(20))
SELECT d.dept_name,
       s.service_name,
       COUNT(*) AS all_row_count,
       IF(t.tx_status = 1,
          SELECT COUNT(*)
          FROM transaction_detail
          WHERE tx_status = 1) AS successful_tx_count
FROM department AS d
INNER JOIN service s ON s.dept_id=d.dept_id
INNER JOIN transaction_detail t ON s.dept_id=t.dept_id
AND s.service_id=t.service_id
WHERE t.tx_begin_date BETWEEN fromdate AND todate
  AND (t.dept_id = department
       OR department ='null')
  AND (t.tx_status = status
       OR status ='null')
  AND (t.pg_name = ipg
       OR ipg ='null')
GROUP BY t.dept_id,
         t.service_id

请参阅下面添加的行。

IF(t.tx_status = 1, SELECT COUNT(*) FROM transaction_detail WHERE tx_status = 1) AS successful_tx_count is added to the SP.

我该如何解决这个问题?

最佳答案

使用带有 select 的 IF 语句的正确语法是这样的

CREATE DEFINER=`root`@`localhost` PROCEDURE `TxCountByDatePerod`(IN `fromdate` DATE, IN `todate` DATE, IN `department` VARCHAR(20), IN `status` VARCHAR(10), IN `ipg` VARCHAR(20))
SELECT d.dept_name,
       s.service_name,
       COUNT(*) AS all_row_count,
       IF(t.tx_status = 1, 
          (SELECT COUNT(*) FROM transaction_detail WHERE tx_status = 1), 
          0 
         ) AS successful_tx_count
FROM department AS d
INNER JOIN service s ON s.dept_id=d.dept_id
INNER JOIN transaction_detail t ON s.dept_id=t.dept_id
AND s.service_id=t.service_id
WHERE t.tx_begin_date BETWEEN fromdate AND todate
  AND (t.dept_id = department
       OR department ='null')
  AND (t.tx_status = status
       OR status ='null')
  AND (t.pg_name = ipg
       OR ipg ='null')
GROUP BY t.dept_id,
         t.service_id

注意:

我只是输入了默认值 0,因为您正在计数,但您可以更改它

IF(t.tx_status = 1
    ,(SELECT COUNT(*) FROM transaction_detail WHERE tx_status = 1)
    ,0 -- # -- this can be anything.. you could put in NULL or whatever else if you want
  ) AS successful_tx_count

您还可以使用用户定义的变量并像这样插入

SET @a := (SELECT COUNT(*) FROM transaction_detail WHERE tx_status = 1);

然后像这样在你的 if 语句中插入 @a 变量

if(t.tx_status = 1, @a, 0)

查看此 ARTICLE有关 if 函数的更多详细信息

关于mysql - MySQL 中 SELECT 内的 IF 语句 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487353/

相关文章:

mysql - SQL组函数

php - 检查字符串是否包含来自数据库的短语

Sql 选择具有 column1 值的行出现多个 column2 值

php mysql 用for循环保存mysql

Mysql 使用 IN 查询强制更新索引

syntax - MYSQL 查询 : extract all records that have SSCF in the LicenseNumber

java - 如何使用 java/scala 将图像数据插入 mySql mediumtext 字段?

mysql - 从多列按日期分组?

php - 如何比较不同表中的两行并在行匹配时显示表值?

MySQL 从一个表中选择另一个表中不存在的记录