【问题标题】:Stored procedure for monthly sales with discount折扣月销售的存储过程
【发布时间】:2014-03-07 05:36:57
【问题描述】:

我需要有关如何创建存储过程或许多存储过程以在我们公司生成月度销售报告的建议。我已将表格缩短以使其更易于理解:

我们有两张桌子:

  • ITEM_SALES,包括:

        Item_ID
        Name
        Store
        Sales_Date
        Sales_Price
        Quantity
    
  • 还有ITEM_DISCOUNT,其中包括:

        Item_ID
        Name
        Store
        Sales_Price
        Date_From
        Date_To
    

说明:每个月之后,我们不同的商店都会向我们发送一份关于他们有哪些折扣的报告。这些折扣可以从一天到多天不等,因此我们有 Date_From、Date_to。

我的想法:要制作这个销售报告,我需要一个程序,首先获取ITEM_SALES 中的所有销售,然后检查ITEM_DISCOUNT 中的所有折扣并覆盖具有相似Item_IDName 的折扣,和Store 在选定的时间段内。

示例:因此,如果一个项目最初的 sales_price 为 99,- 然后在 2014-01-02 至 2014-01-10 期间将 sales_price 折扣为 79,- 它必须在该期间被覆盖,因此报告显示正确的数字。

这可以理解吗?任何人都可以帮助我或给我一些建议吗?临时表对此有好处吗?

如果需要更多信息,我会提供!

【问题讨论】:

  • 您要求使用 SQL - 我认为这在 MySQL 中相对容易解决,但我不确定解决方案是否是纯 SQL99。你想看吗?
  • 是的,那太好了。

标签: sql stored-procedures accounting


【解决方案1】:

您可以在存储过程中使用LEFT JOIN 创建报告,其中需要报告的月份和年份,可以作为参数传递,如下所示:

SQL 服务器:

CREATE PROCEDURE GetSalesReport 
   @month INT, 
   @year  INT 
AS 
  SELECT isa.Item_ID,
         isa.Name,
         isa.Store,
         isa.Sales_Date,
         COALESCE(id.Sales_Price, isa.Sales_Price) AS SalesPrice,
         isa.Quantity
       FROM ITEM_SALES AS isa
       LEFT JOIN ITEM_DISCOUNT AS id
       ON  isa.Item_ID = id.Item_ID
       AND isa.Name = id.Name
       AND isa.Store = id.Store
       AND isa.Sales_Date BETWEEN id.Date_From AND id.Date_To 
       WHERE MONTH(isa.Sales_Date) = @month AND YEAR(isa.Sales_Date) = @year

【讨论】:

  • 这获得了所有的销售额
  • 您想要当月的报告吗?
  • 这对我来说似乎是正确的方向。 @DipenduPaul,我以为你想要所有的销售额?
  • 我希望能够选择月份
  • 对不起,我以为我标记了它,Microsoft SQL Server 2008 R2 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-30
相关资源
最近更新 更多