【问题标题】:Calculating monthly sales based on a quarter按季度计算月销售额
【发布时间】:2015-05-29 16:01:25
【问题描述】:

我需要计算给定季度的月销售额。

这是我计算上一季度的代码。

set @quarter = datepart(QQ, getdate()) - 1

if @quarter = 0 
    begin
    set @quarter = 4
    set @year = datepart(year, getdate()) -1
    end
else set @year = datepart(year, getdate())

这是我计算整个季度平均月销售额的代码。

SELECT TOP 5 d.sdealer_name, COUNT(c.icontract_id) / 3 as 'AverageMonthlySales'
FROM dealers d 
INNER JOIN contracts c 
    ON c.sdealer_number = d.sdealer_number 
WHERE (d.sdealer_number NOT LIKE '%demo%' 
  AND d.sdealer_status in ('A', 'R') 
  AND c.sagent_number = @sagent_number
  AND c.sstatus in ('P', 'A', 'C', 'E') 
  AND c.iproduct_type_id in (4)
  AND DATEPART(QQ, c.dtcontract_sale_date) = @quarter 
  AND DATEPART(year, c.dtcontract_sale_date) = @year)
GROUP BY  d.sdealer_name
ORDER BY COUNT(distinct c.icontract_id) desc

如何动态计算给定季度每个月的总销售额?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    ctrl+h ...只需将季度日期部分替换为月份。有什么原因你没有尝试过吗?

    set @month = datepart(month, getdate()) - 1
    
    if @month = 0 
        begin
        set @month = 12
        set @year = datepart(year, getdate()) -1
        end
    else set @year = datepart(year, getdate())
    
    SELECT TOP 5 d.sdealer_name, COUNT(c.icontract_id) as 'AverageMonthlySales'
    FROM dealers d 
    INNER JOIN contracts c 
        ON c.sdealer_number = d.sdealer_number 
    WHERE (d.sdealer_number NOT LIKE '%demo%' 
      AND d.sdealer_status in ('A', 'R') 
      AND c.sagent_number = @sagent_number
      AND c.sstatus in ('P', 'A', 'C', 'E') 
      AND c.iproduct_type_id in (4)
      AND DATEPART(month, c.dtcontract_sale_date) = @month 
      AND DATEPART(year, c.dtcontract_sale_date) = @year)
    GROUP BY  d.sdealer_name
    ORDER BY COUNT(distinct c.icontract_id) desc
    

    【讨论】:

    • 对于“给定季度”,您可能仍需要添加季度条件。
    • 不。 Datepart( month, n ) = {1,2,3} == datepart( qq, n ) = 1 以此类推 q 的 2、3 和 4。用你的数据集试试吧
    • 我不确定这应该如何复制所需的内容,而无需添加大量代码来检查它在哪个季度(SQL 会自动与 QQ 一起执行)。例如,运行您的代码@month 在应该返回 (1/2/3) 时返回 5。因为上一季度将是几个月(1/2/3)。我试图避免添加几个 if 语句(如果 @month = 1,2,3)@quarter = 1)等等。datepart(qq, getdate()) - 1datepart(month, getdate()) - 1 之间有很大的不同我希望有一些 sql 魔法处理它,但到目前为止看起来并不是那样。
    • datepart( qq )datepart( month ) 之间的区别是不言而喻的:自给定年初以来的季度或日期的期间数。 datepart( month, '2015-05-31' ) 将始终等于 5。同样,datepart( qq, '2015-05-31' ) 将始终等于 2。如果您想要单月分组,请使用我提供的示例。您应该注意,使用 OP 代码,您返回的是自当前季度 ( 2015-04-01 ) 开始以来的 1/3 平均值,而不是过去 3 个月的平均值。
    • 我不确定您为什么删除了DATEPART(qq),因为这是我需要跟踪的信息。我需要检查上一季度的销售情况,即months (1,2,3)。您的查询返回 5 月份,这超出了我的标准。我可以看到使我需要的工作的唯一方法是使用更多的 IF 语句。如果季度 = 1 则 @month1 = jan @month2 = feb 等...如果我要使用 DATEPART(m),我将不得不添加更多 if 语句。我很感激时间和答案,但是我只是不相信它与这个特定问题有关。
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多