create table 会员积分表
(
会员ID varchar2(50),会员余额 number(16,2)
);
create table 会员消费表
(
会员ID varchar2(50),
日期 date,
消费金额 number(16,2),
会员余额 number(16,2)
);
insert into 会员积分表(会员ID,会员余额) values (1,1000);--比如:2020-01-01充了1000元
insert into 会员消费表(会员ID,日期,消费金额,会员余额) values (1,'2021-01-01',10,990);
insert into 会员消费表(会员ID,日期,消费金额,会员余额) values (1,'2021-02-03',10,980);
insert into 会员消费表(会员ID,日期,消费金额,会员余额) values (1,'2021-06-01',10,970);
insert into 会员消费表(会员ID,日期,消费金额,会员余额) values (1,'2023-04-11',10,960);
要求:查询某一天会员的余额,比如客户要看2022-01-01这表的余额,像这种表结构的设计要怎么写SQL,才能从消费流水表中,查询出指定日期的会员余额了
SELECT 会员消费表.日期, 会员积分表.会员余额 - SUM(会员消费表.消费金额) OVER (ORDER BY 会员消费表.日期) AS 余额
FROM 会员积分表
JOIN 会员消费表 ON 会员积分表.会员ID = 会员消费表.会员ID
WHERE 会员积分表.会员ID = '1'
and 日期 = 指定日期
ORDER BY 会员消费表.日期
可以使用SQL语句中的子查询来实现从消费流水表中查询出指定日期的会员余额。具体的SQL语句如下:
SELECT 会员ID, 会员余额
FROM 会员消费表
WHERE 日期 <= '2022-01-01' AND 会员ID = (
SELECT 会员ID
FROM 会员消费表
WHERE 日期 <= '2022-01-01'
ORDER BY 日期 DESC
LIMIT 1
);
上述SQL语句中,首先在外层SELECT语句中查询出所有日期小于等于'2022-01-01'的会员消费记录,然后使用子查询在这些记录中找到最后一条记录对应的会员ID,即为指定日期的会员ID。接着,在WHERE子句中使用该会员ID和指定日期来查询该会员在指定日期的余额。
需要注意的是,这里假设会员消费表中的日期按照时间顺序排列,如果不是按照时间顺序排列,则需要根据实际情况修改ORDER BY子句的内容。另外,这里没有考虑会员在指定日期之前没有消费记录的情况,如果需要考虑这种情况,则需要使用更为复杂的SQL语句。