原创

如何使用 SQL 语句实现不同状态列转行显示订单数量?

问题:

表名:ORDEERS

字段包含ID、NO、DATE、PAY_STATUS、STATUS,其中NO是订单号,DATE是下单日期,PAY_STATUS是付款状态(已付款、未付款),STATUS是订单状态(正常、申请改单、申请作废、作废)。

要求:查询出下单日期为7.1日至7.31日内,分别统计出每日已付款、未付款、正常、申请改单、申请作废、作废的订单数量,返回结果列为下单时间、已付款、未付款、正常、申请改单、申请作废、作废。

分析:

通过上述要求分析可知需要需要用到条件查询,并根据订单状态、付款状态以及日期分组统计,统计完成后需要列转行展示数据已满足要求。

解答:

SELECT
t.date AS '下单时间',
SUM( CASE `PAY_STATUS` WHEN '已付款' THEN sum ELSE 0 END ) AS '已付款',
SUM( CASE `PAY_STATUS` WHEN '未付款' THEN sum ELSE 0 END ) AS '未付款',
SUM( CASE `STATUS` WHEN '正常' THEN sum ELSE 0 END ) AS '正常',
SUM( CASE `STATUS` WHEN '申请改单' THEN sum ELSE 0 END ) AS '申请改单',
SUM( CASE `STATUS` WHEN '申请作废' THEN sum ELSE 0 END ) AS '申请作废',
SUM( CASE `STATUS` WHEN '作废' THEN sum ELSE 0 END ) AS '作废' 
FROM
(
SELECT
date_format( DATE, '%Y-%m-%d' ) date,
count( id ) sum,
PAY_STATUS,
`STATUS` 
FROM
ORDEERS 
WHERE
date_format( DATE, '%Y-%m-%d' ) BETWEEN '2021-07-01' 
AND '2021-07-31' 
GROUP BY
PAY_STATUS,
STATUS,
date_format( DATE, '%Y-%m-%d' )) t 
GROUP BY
t.date
~阅读全文-人机检测~

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信