SQL 语句求助,下述需求可否用一条语句优雅地实现?

2022-02-13 00:25:36 +08:00
 LeeReamond

需求:客户充值积分,充值金额与积分并不按严格乘法对应,而是充值越多送的越多,比如充值 6 元得 600 积分,充值 10 元得 1200 积分,充值 20 元得 2500 积分这种。数据库里只存了用户激活后获得的积分,没有存实际金额。能否用一句 SQL 查询搜索出指定时间范围内所有用户总充值金额?

比如如下表

+----+-------+---------------------+
| id | value | update_time         |
+----+-------+---------------------+
|  1 |   600 | 2022-02-08 15:16:05 |
|  2 |  1200 | 2022-02-07 03:58:01 |
|  3 |   600 | 2022-02-06 05:30:40 |
+----+-------+---------------------+

搜索 6-8 日内总计金额,希望得到的结果是 22 ,有什么写法不用经过业务在 sql 就能解决吗?

1107 次点击
所在节点    问与答
4 条回复
jptx
2022-02-13 00:54:06 +08:00
由于并不知道金额与积分的计算方式,所以目前的简单思路是假设用户只能选择几种充值金额,然后穷举对应关系写进 SQL 。
```sql
select sum(case `value` when 600 then 6 when 1200 then 10 when 2500 then 20 剩下的自己补充...... else 自己补充异常情况 end ) from 这张表 where update_time > ? and update_time < ? and 其他条件
```
ETiV
2022-02-13 01:01:24 +08:00
写法就是 LS+1 ,但我们不知道对于性能要求是啥样的,你最好自己有个判断

另外最好是再维护一张价格和积分的映射表,然后 join 是最方便的,不要把这种规则写在代码里
LeeReamond
2022-02-13 01:11:48 +08:00
@ETiV 维护性的需求,不需要向用户展示,且充值档位有限,总体来说 1L 满足需求了,感谢
hay313955795
2022-02-13 08:48:03 +08:00
为啥不把金额也冗余到表里呢. 后面如果规则变了不是很麻烦?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/833489

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX