【MySQL】使用 UNION ALL 合并多个 SQL 查询出来的字段(思路)

模拟表(canteen)

字段含义
consume_time消费时间
name姓名
amount消费金额

编写 SQL 求出早餐、午餐、晚餐用餐人数,以及用餐总人数和用餐总金额

已知

开始时间结束时间
上午00:00:0009:00:00
中午09:00:0016:00:00
下午16:00:0023:59:59

查询的字段名

字段含义
amNum早餐用餐人数
noonNum中午用餐人数
pmNum晚餐用餐人数
diningNum用餐总人数
diningAmount用餐总金额

SQL 编写(开始时间和结束时间格式yyyy-MM-dd)

SELECT SUM(amNum) AS amNum,
	   SUM(noonNum) AS noonNum,
	   SUM(pmNum) AS pmNum,
	   SUM(diningNum) AS diningNum,
	   SUM(diningAmount) AS diningAmount
FROM (
	SELECT COUNT(*) AS amNum,
    	   NULL AS noonNum,
    	   NULL AS pmNum,
	   	   NULL AS diningNum,
	   	   NULL AS diningAmount
    FROM canteen
    WHERE consume_time >= 开始时间 AND consume <= DATEADD(DAY, 1, 结束时间)
      AND CONVERT(VARCHAR, consume_time, 8) BETWEEN '00:00:00' AND '09:00:00'
    
    UNION ALL
    
    SELECT NULL AS amNum,
    	   COUNT(*) AS noonNum,
    	   NULL AS pmNum,
	   	   NULL AS diningNum,
	   	   NULL AS diningAmount
    FROM canteen
    WHERE consume_time >= 开始时间 AND consume <= DATEADD(DAY, 1, 结束时间)
      AND CONVERT(VARCHAR, consume_time, 8) BETWEEN '09:00:00' AND '16:00:00'
    
    UNION ALL
    
    SELECT NULL AS amNum,
    	   NULL AS noonNum,
    	   COUNT(*) AS pmNum,
	   	   NULL AS diningNum,
	   	   NULL AS diningAmount
    FROM canteen
    WHERE consume_time >= 开始时间 AND consume <= DATEADD(DAY, 1, 结束时间)
      AND CONVERT(VARCHAR, consume_time, 8) BETWEEN '16:00:00' AND '23:59:59'
    
    UNION ALL
    
    SELECT NULL AS amNum,
    	   NULL AS noonNum,
    	   NULL AS pmNum,
	   	   COUNT(*) AS diningNum,
	   	   ISNULL(ABS(SUM(amount), 0)) AS diningAmount
    FROM canteen
    WHERE consume_time >= 开始时间 AND consume <= DATEADD(DAY, 1, 结束时间)
) AS canteenBoard
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值