计算总销量与总销售额的SQL视图编写正确性核查求助
SQL代码核查及修正说明
你的SQL代码存在多个逻辑和语法问题,具体问题和修正方案如下:
- 核心GROUP BY逻辑错误:你将
il.Quantity、il.SellingPrice两个字段加入了GROUP BY子句,这会导致sum聚合失效,等于按每一行的销量、售价单独分组,完全达不到按日期+产品维度汇总总销量、总销售额的需求,必须把这两个字段从GROUP BY中删除。 - 日期转换语法不合法:你写的
('01-01-2021','dd-mm-yyyy')不是合法的日期转换写法,不同数据库的日期转换语法有区别:Oracle使用TO_DATE('01-01-2021','dd-mm-yyyy'),MySQL使用STR_TO_DATE('01-01-2021','%d-%m-%Y'),需要根据你使用的数据库类型调整。 - 聚合字段缺失别名:
sum(il.Quantity)、sum(il.SellingPrice)两个聚合计算字段没有设置别名,后续查询这个视图时无法直接调用这两个统计字段。 - 表连接写法过时:使用逗号分隔表的老式隐式连接写法可读性差,容易出现关联错误,建议改为
JOIN...ON的标准显式连接写法,逻辑更清晰。 - 视图定义中加ORDER BY不符合规范:绝大多数数据库不支持在视图定义里添加ORDER BY子句,排序逻辑应该在查询视图的时候单独指定,视图中添加ORDER BY要么直接报错,要么不会生效。
- 约束名与视图名重复:你设置的只读约束名和视图名同为
totalesales,会触发对象重名报错,需要更换为其他不重复的约束名。
修正后的参考代码(以Oracle为例)
Create View totalsales AS select inv.InvoiceDate, po.ProdCode, po.ProdName, sum(il.Quantity) AS total_sold_units, sum(il.SellingPrice) AS total_sales_amount from Invoice inv INNER JOIN InvoiceLine il ON inv.InvoiceNo = il.InvoiceNo INNER JOIN Product po ON po.ProdCode = il.ProdCode where inv.InvoiceDate between TO_DATE('01-01-2021','dd-mm-yyyy') AND TO_DATE('31-03-2021','dd-mm-yyyy') group by inv.InvoiceDate, po.ProdCode, po.ProdName WITH READ ONLY CONSTRAINT totalsales_readonly;
补充说明
你给统计视图加只读约束的思路是合理的,这类仅用于数据查询统计的视图不需要支持写入操作,加只读约束可以避免误操作修改底层业务数据。如果使用的是MySQL数据库,暂不支持WITH READ ONLY语法,可通过限制操作账号的写入权限实现相同的安全效果。
内容的提问来源于stack exchange,提问作者Joshua Tabi
相关产品推荐
相关产品推荐

