计算总销量和总销售额
Posted
技术标签:
【中文标题】计算总销量和总销售额【英文标题】:Calculate total units sold and total sales value 【发布时间】:2021-09-25 10:11:30 【问题描述】:你能帮我检查一下我的答案是否正确吗?我对数据库真的很陌生
这是问题
这是我的答案
Create View totalsales AS
select inv.InvoiceDate, po.ProdCode, po.ProdName, sum(il.Quantity), sum(il.SellingPrice)
from Invoice inv, Product po, InvoiceLine il
where inv.InvoiceNo = il.InvoiceNo and po.ProdCode = il.ProdCode and inv.InvoiceDate between ('01-01-2021','dd-mm-yyyy') AND ('31-03-2021','dd-mm-yyyy')
group by inv.InvoiceDate, po.ProdCode, po.ProdName, il.Quantity, il.SellingPrice
order by sum(il.Quantity) DESC
WITH READ ONLY CONSTRAINT totalsales;
我使用只读约束的原因是为了提高安全性!
【问题讨论】:
显然您正在学习 SQL - 使用现代 ANSI 连接语法,不要习惯旧的、专有的 Oracle 连接语法。 @WernfriedDomscheit 我不确定这是 Oracle 专有语法,除非有(+)
。
@WilliamRobertson,至少JOIN ... ON
语法比... , ...
更常见
@WernfriedDomscheit 我当然希望如此。
【参考方案1】:
在我看来,查询是这样的:
CREATE VIEW totalsales AS
SELECT
po.prodcode,
po.prodname,
SUM(il.quantity) sum_quantity,
SUM(il.sellingprice) sum_sellingprice
FROM
invoice inv
JOIN invoiceline il ON il.invoiceno = inv.invoiceno
JOIN product po ON po.prodcode = il.prodcode
WHERE
inv.invoicedate BETWEEN DATE '2021-01-01' AND DATE '2021-03-31'
GROUP BY
po.prodcode,
po.prodname
WITH READ ONLY;
如果与你的相比:
不要选择您不需要的列 (invoicedate
),因为它会影响最终结果,因为您必须将其包含在 group by
子句中,这样您就可以在每个发票日期获得“拆分”值以及(这不是你想要的)
正确加入表(即不要将它们包含在用逗号分隔的 FROM
子句中,然后不要将它们加入到 WHERE
子句中 - 将条件放入其中
条件与发票日期有关;您的代码缺少 TO_DATE
函数,例如between to_date('01-01-2021','dd-mm-yyyy')
。在这种情况下,我建议您使用格式为 date 'yyyy-mm-dd'
的日期文字
with read only
仅限;没有别的了
在视图中排序?这没有多大意义(在我看来)。只需创建它,然后在您从视图中选择时对值进行排序,例如
select prodname, sum_quantity
from totalsales
order by sum_quantity desc
【讨论】:
我可以知道为什么要使用 Join 吗? 但是@Littlefoot,如果我坚持应用排序命令,它会像这样“按总和(il.Quantity)DESC 排序”,我只是满足问题条件。 TQSOMUCH 那就是order by sum_quantity desc
。不客气。【参考方案2】:
您可能会考虑创建这样的视图:
Create View totalsales AS
select po.ProdCode, po.ProdName,
sum(il.Quantity), sum(il.SellingPrice*il.Quantity)
from Invoice inv, Product po, InvoiceLine il
where po.ProdCode = il.ProdCode(+)
and il.InvoiceNo = inv.InvoiceNo(+)
and trunc(inv.InvoiceDate(+),'Q') = date'2021-01-01'
group by po.ProdCode, po.ProdName
order by sum(il.Quantity) DESC
WITH READ ONLY
它将输出所有产品。但对于 2021 年第一季度未售出的产品,总计将为空。如果您只需要 2021 年销售的产品 - 从谓词中删除所有 (+)。
我还写了 sum(il.SellingPrice*il.Quantity) 对于总销售额,因为我不确定 sellPrice 是所有数量的价格,而不仅仅是一个单位的价格。如果 sellprice 是所有单位的价格,则只需将 sum(il.SellingPrice*il.Quantity) 替换为 sum(il.SellingPrice).
【讨论】:
请问+号是干什么用的? 那是“旧”Oracle 的外连接运算符。 为什么叫它“老”?它仍在最新的 Oracle 版本中使用。此外,没有它,您将无法做某些事情。例如构建具有快速刷新的物化视图。 你不能用它做某些事情,@Andrew(例如,将同一个表外连接到多个表;除非我错了,当然)。 “旧”,因为它在 9i 之前的版本中使用过,而且是 旧。 @Littlefoot,上述情况不适用于多张表的外连接。但是,轮到话题作者对上面提到的所有答案说几句话了。以上是关于计算总销量和总销售额的主要内容,如果未能解决你的问题,请参考以下文章