在SELECT中的IF语句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
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_statuscoulmn),它们分别是:完成(1),失败(-1),未完成(0)。

我想做的是获取下面报告的数据。

在此处输入图片说明

现在的问题是所有状态都分组为一行。我尝试使用下面的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.

我怎样才能解决这个问题?

约翰·鲁德尔

将IF语句与select配合使用的正确语法如下所示

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);

然后像这样将@a变量插入if语句中

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

有关if函数的更多详细信息,请参见此文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

sql中的select查询中的case语句

来自分类Dev

SQL查询中的THEN语句

来自分类Dev

在select语句SQL查询中动态添加列值

来自分类Dev

可视C#中的SQL SELECT和多个AND查询语句

来自分类Dev

SQL查询,多个JOIN和SELECT(?)语句

来自分类Dev

C#SELECT语句,SQL查询

来自分类Dev

在SELECT查询中使用SQL别名语句

来自分类Dev

使用select语句的SQL更新查询

来自分类Dev

SQL查询错误(嵌套的select语句)

来自分类Dev

SQL语句-SELECT此查询的逆函数

来自分类Dev

CASE中的Select语句-SQL

来自分类Dev

SELECT子查询中的IF / CASE语句

来自分类Dev

WHERE中的SQL查询中的CASE语句

来自分类Dev

如何在输出中的SQL查询的Select语句中附加度量单位

来自分类Dev

如果在SQL中查询语句?

来自分类Dev

子查询中的SQL Group By语句

来自分类Dev

SQL-查询中的条件ISNULL语句

来自分类Dev

oracle查询中的IF语句(不是PL / SQL)?

来自分类Dev

在SQL查询中添加case语句

来自分类Dev

存储过程中的SQL查询IF语句

来自分类Dev

SQL查询中的CASE WHEN语句示例

来自分类Dev

在SQL查询中插入日志语句

来自分类Dev

SQL查询-SUM中的SELECT

来自分类Dev

从SQL中的SELECT查询更新

来自分类Dev

子查询中的SQL Select

来自分类Dev

SQL查询-SUM中的SELECT

来自分类Dev

将WITH语句重写为SQL中的子查询语句?

来自分类Dev

在基于IF语句的SQL查询中添加WHERE语句

来自分类Dev

如何在SQL语句的Select子句中引用子查询