如何处理 SELECT CASE WHEN state = 2 THEN '待核销' WHEN state = 4 THEN '已完成' WHEN state = 6 THEN '待成团' WHEN state = 5 AND payment_state = 1 THEN '已退款' WHEN state = 7 THEN '待售后' ELSE '已退款' END `name`, IFNULL(CASE WHEN state = 2 THEN '1' WHEN state = 4 THEN '1' WHEN state = 6 THEN '1' WHEN state = 5 AND payment_state = 1 THEN '1' WHEN state = 7 THEN '1' ELSE '0' END,0) `value`, create_time FROM cere_shop_order WHERE create_time LIKE CONCAT( date_format( now(), '%Y-%m-%d' ), '%' ) GROUP BY `name` 这个统计中不存在数据时 name全部为空的问题
时间: 2023-12-08 17:04:52 浏览: 62
sql学习之CASE WHEN THEN ELSE END的用法
你的问题是如何处理在这个统计中不存在数据时,name全部为空的情况。
你可以使用 `LEFT JOIN` 操作从另一个包含所有 `name` 值的表中获取数据。这样即使在原始表中没有数据,也会返回包含所有 `name` 值的结果集。
以下是修改后的SQL查询语句:
```
SELECT t.name, IFNULL(s.value, 0) AS value, t.create_time
FROM (
SELECT '待核销' AS name, 2 AS state, 0 AS payment_state
UNION ALL SELECT '已完成', 4, 0
UNION ALL SELECT '待成团', 6, 0
UNION ALL SELECT '已退款', 5, 1
UNION ALL SELECT '待售后', 7, 0
) t
LEFT JOIN (
SELECT
CASE
WHEN state = 2 THEN '待核销'
WHEN state = 4 THEN '已完成'
WHEN state = 6 THEN '待成团'
WHEN state = 5 AND payment_state = 1 THEN '已退款'
WHEN state = 7 THEN '待售后'
END AS name,
COUNT(*) AS value
FROM cere_shop_order
WHERE create_time LIKE CONCAT(date_format(NOW(), '%Y-%m-%d'), '%')
GROUP BY name
) s ON t.name = s.name
```
这个查询语句使用了一个表别名 `t` 来表示包含所有 `name` 值的表,使用了一个表别名 `s` 来表示原始表。在 `t` 中定义了所有可能的 `name` 值。使用 `LEFT JOIN` 操作将两个表连接起来,确保即使在原始表中没有数据,也会返回包含所有 `name` 值的结果集。使用 `IFNULL` 函数处理 `value` 值为空的情况。
阅读全文