sql server按最近24小时、上周和上月对a组进行升级,并按周降序排序

nx7onnlm  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(427)

我想看看过去24小时、一周、一个月,不同的促销活动有多成功。为了得到过去24小时的促销金额,我已经使用了这个代码,但我不明白如何获得另外两列的最后一周和最后一个月。最后我想按上周的数量降序订购。我想在这个月的任何时候都能运行这个查询。请帮帮我。

SELECT Promotion
     , Sum(Amount) AS Last_24
  FROM   dbo.CustomerPayment
 WHERE  Started >= DATEADD(day, - 1, GETDATE()) 
 GROUP 
    BY Promotion
ecfsfe2w

ecfsfe2w1#

您可以在单个查询中执行此操作:

SELECT Promotion
     , Sum(CASE WHEN Started >= DATEADD(day, -1, GETDATE()) THEN Amount ELSE 0 END) AS Last_24
     , Sum(CASE WHEN Started >= DATEADD(day, -7, GETDATE()) THEN Amount ELSE 0 END) AS Last_Week
     , Sum(Amount) AS Last_Month
  FROM   dbo.CustomerPayment
 WHERE  Started >= DATEADD(day, - 31, GETDATE()) 
 GROUP 
    BY Promotion
 ORDER BY Last_Week DESC

请注意,此部分:

WHERE  Started >= DATEADD(day, - 31, GETDATE())

正如你对“上个月”概念的解释所阐明的那样。

nzkunb0c

nzkunb0c2#

使用条件聚合——也就是说,将条件移动到 select :

SELECT Promotion,
       SUM(case when Started >= DATEADD(day, - 1, GETDATE()) then Amount end) AS Last_1_day,
       SUM(case when Started >= DATEADD(day, - 7, GETDATE()) then Amount end) AS Last_7_day,
       . . . 
FROM  dbo.CustomerPayment
GROUP BY Promotion;

不过,有一个可能的问题。 GETDATE() --不管它的名字是什么--返回日期的时间组件。我怀疑你可能真的想把这当成一个约会,而不是一个约会时间:

SELECT Promotion,
       SUM(case when Started >= DATEADD(day, - 1, CONVERT(DATE, GETDATE())) then Amount end) AS Last_1_day,
       SUM(case when Started >= DATEADD(day, - 7, CONVERT(DATE, GETDATE())) then Amount end) AS Last_7_day,
       . . . 
FROM  dbo.CustomerPayment
GROUP BY Promotion;
kh212irz

kh212irz3#

我在找月/周。不是7/30天。
如果您希望这样,只需使用变量使查询可读。

declare @monthstart date,
        @weekstart date
;
select @monthstart=datefromparts(year(current_timestamp),month(current_timestamp),1)
select cast(DATEADD(d,1-DATEPART(WEEKDAY,current_timestamp),CURRENT_TIMESTAMP) as date) as Sunday,
    cast(DATEADD(d,2-case when DATEPART(WEEKDAY,current_timestamp)=1 then 8 else DATEPART(WEEKDAY,current_timestamp) end,CURRENT_TIMESTAMP) as date) as Monday
;

相关问题