计算总销量和总销售额

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,上述情况不适用于多张表的外连接。但是,轮到话题作者对上面提到的所有答案说几句话了。

以上是关于计算总销量和总销售额的主要内容,如果未能解决你的问题,请参考以下文章

pandas group 日期到季度和总销售额列

从 2 个单独的表中聚合计算

如何显示每个产品的总订单销售额和产品相关信息。数据库服务器 2014

11月销量盘点:小鹏汽车销售4224辆,P7累计交付破万

如何获得两个查询结果集之间的差异

苹果在与Epic的诉讼中要求Steam提供销量信息