2017-01-25 35 views
1

与上月相比,我试图在本月下单(创建)的订单数量上升或下降。(T-SQL)上涨或下跌增长

它应该是这样的:

SELECT [o].ClientID 
    ,[ru].UnitName 
    ,YEAR(GETDATE()) AS [Current Year] 
    ,[Current Month] = 
     CASE 
      WHEN MONTH(GETDATE()) = 1 THEN 'JANUARY' 
      WHEN MONTH(GETDATE()) = 2 THEN 'FEBRUARY' 
      WHEN MONTH(GETDATE()) = 3 THEN 'MARCH' 
      WHEN MONTH(GETDATE()) = 4 THEN 'APRIL' 
      WHEN MONTH(GETDATE()) = 5 THEN 'MAY' 
      WHEN MONTH(GETDATE()) = 6 THEN 'JUNE' 
      WHEN MONTH(GETDATE()) = 7 THEN 'JULY' 
      WHEN MONTH(GETDATE()) = 8 THEN 'AUGUST' 
      WHEN MONTH(GETDATE()) = 9 THEN 'SEPTEMBER' 
      WHEN MONTH(GETDATE()) = 10 THEN 'OCTOBER' 
      WHEN MONTH(GETDATE()) = 11 THEN 'NOVEMBER' 
      WHEN MONTH(GETDATE()) = 12 THEN 'DECEMBER' 
      ELSE NULL 
     END 
    ,COUNT([o].OrderID) AS [Current Month Orders Placed] 
    ,[Prior Month] = 
     CASE 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 1 THEN 'JANUARY' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 2 THEN 'FEBRUARY' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 3 THEN 'MARCH' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 4 THEN 'APRIL' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 5 THEN 'MAY' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 6 THEN 'JUNE' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 7 THEN 'JULY' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 8 THEN 'AUGUST' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 9 THEN 'SEPTEMBER' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 10 THEN 'OCTOBER' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 11 THEN 'NOVEMBER' 
      WHEN DATEPART(m, DATEADD(m, - 1, getdate())) = 12 THEN 'DECEMBER' 
      ELSE NULL 
     END 
    ,COUNT([o].OrderID) AS [Prior Months Orders Placed] 
    ,[Current Month Orders Placed] * [ Prior Months Orders Placed] AS [Comparison Percentage] 
FROM Valuations.dbo.[Order] [o](NOLOCK) 
    INNER JOIN Valuations.dbo.resnet_unit ru(NOLOCK) ON [o].ClientID = ru.UnitId 
WHERE YEAR([o].DateCreated) = YEAR(GETDATE()) 
    AND MONTH([o].DateCreated) = MONTH(GETDATE()) 
GROUP BY MONTH([o].DateCreated) 
    ,[o].ClientID 
    ,[ru].UnitName 
+0

SQL Server 2008或2012的版本? –

+3

自己动手尝试选择DateName(MM,GetDate()) –

+0

服务器版本是2008. – IeeTeY

回答

1

这应该做你需要什么,未经测试显然你已经不提供测试数据。

SELECT [o].ClientID 
    ,[ru].UnitName 
    ,YEAR(GETDATE()) AS [Current Year] 

    ,[Current Month] = dateName(MM,GetDate()) 
    ,sum(case when [o].DateCreated >= dateadd(m,datediff(m,0,getdate()),0) -- First day of this month 
        and [o].DateCreated < dateadd(m,datediff(m,0,getdate())+1,0) -- First day of next month 
       then 1 
       else 0 
       end) AS [Current Month Orders Placed] 

    ,[Prior Month] = dateName(MM,dateadd(MM,-1,GetDate())) 
    ,sum(case when [o].DateCreated >= dateadd(m,datediff(m,0,getdate())-1,0) -- First day of last month 
        and [o].DateCreated < dateadd(m,datediff(m,0,getdate()),0) -- First day of this month 
       then 1 
       else 0 
       end) AS [Prior Months Orders Placed] 

    --Current Month Orders Placed 
    ,isnull(sum(case when [o].DateCreated >= dateadd(m,datediff(m,0,getdate()),0) -- First day of this month 
        and [o].DateCreated < dateadd(m,datediff(m,0,getdate())+1,0) -- First day of next month 
       then 1. -- Decimal points ensure the percentage division works by not returning integer values. 
       else 0. 
       end) 
     --Prior Months Orders Placed 
     /nullif(sum(case when [o].DateCreated >= dateadd(m,datediff(m,0,getdate())-1,0) -- First day of last month 
         and [o].DateCreated < dateadd(m,datediff(m,0,getdate()),0) -- First day of this month 
        then 1. 
        else 0. 
        end),0),0) AS [Comparison Percentage] 

FROM Valuations.dbo.[Order] [o](NOLOCK) 
    INNER JOIN Valuations.dbo.resnet_unit ru(NOLOCK) ON [o].ClientID = ru.UnitId 

WHERE [o].DateCreated >= dateadd(m,datediff(m,0,getdate())-1,0) -- First day of last month 
    and [o].DateCreated < dateadd(m,datediff(m,0,getdate())+1,0) -- First day of next month 

GROUP BY [o].ClientID 
     ,[ru].UnitName 
+0

除以零遇到的错误。 – IeeTeY

+0

@DariusCastillo立即尝试。 – iamdave

+0

这是完美的。那么,如何将百分比(%)符号添加到比较百分比? – IeeTeY

0

如果DateCreated数据类型不是date,改变convert(...)数据类型相匹配。

使用with common_table_expression as()row_number()得到最后和当前月份的数据并加以比较:

with cte as (
    select 
     o.ClientId 
     , ClientName = ru.UnitName 
     , [Year]  = datepart(year,o.CreatedDate) 
     , [Month]  = datename(month,o.CreatedDate) 
     , [OrderCount]= count(o.OrderId) 
     , rn   = row_number() over (
      partition o.ClientId, ru.UnitName 
      order by datepart(year,o.CreatedDate),datename(month,o.CreatedDate) 
     ) 
    from Valuations.dbo.Order o(nolock) 
     inner join Valuations.dbo.resnet_unit ru(nolock) on o.ClientId = ru.UnitId 
    where o.DateCreated >= /* First day of last month */ 
     convert(date,dateadd(month, datediff(month, 0, getdate())-1, 0)) 
    group by 
     o.ClientId 
     , o.ClientName 
     , ru.UnitName 
     , datepart(year,o.CreatedDate) 
     , datename(month,o.CreatedDate) 
) 
select 
    c.ClientId 
    , c.ClientName 
    , c.[Year] 
    , c.[Month] 
    , [Orders Placed] = c.OrderCount 
    , [Prior Month] = p.[Month] 
    , [Prior Month Count] 
    , [Comparison Percentage] = c.OrderCount/(nullif(p.OrderCount ,0)+0.0) 
from (select * from cte where rn = 1) as c 
    left join (select * from cte where rn = 2) as p 
    on c.ClientId = p.ClientId