Sql server 两个月前的数据

Sql server 两个月前的数据,sql-server,Sql Server,我有一个基本事务表,下面的查询为我提供了上一个整月的所有事务的计数: Select count(status) FROM TX WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0) AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 我想要的是将该值与前一个整月的值进行比较,找出增加或减少的百分比 例如,我们在7月份,上面的查询将为我提供6月

我有一个基本事务表,下面的查询为我提供了上一个整月的所有事务的计数:

Select count(status)
FROM TX 
WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)
我想要的是将该值与前一个整月的值进行比较,找出增加或减少的百分比

例如,我们在7月份,上面的查询将为我提供6月份ie 100的交易计数。我需要在2个月前计算5月份的总数,并找出%的差异。所以,如果五月是50,六月是100,那么查询应该返回100%


有什么想法吗?

试试下面的方法,应该可以,但不要认为这是最好的解决方案:

declare @lastMonth int = 
  (Select count(status)
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))

declare @beforeLastMonth int = 
  (Select count(status)
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-2,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0))


declare @result int = (@lastMonth - @beforeLastMonth) * 100 / @beforeLastMonth

尝试以下方法,应该可以很好地工作,但不要认为这是最好的解决方案:

declare @lastMonth int = 
  (Select count(status)
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))

declare @beforeLastMonth int = 
  (Select count(status)
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-2,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0))


declare @result int = (@lastMonth - @beforeLastMonth) * 100 / @beforeLastMonth

如果您只需要2个月,那么您可以尝试以下查询。否则,您可以添加系列1,2,3,4,5。。。然后用它代替固定整数:

CREATE TABLE tx
(
    status        CHAR(1)
  , date_reported DATE
);

INSERT INTO tx
VALUES ('A', '20180709')
     , ('B', '20180708')
     , ('A', '20180701')
     , ('B', '20180609')
     , ('A', '20180608')
     , ('A', '20180509')
     , ('B', '20180501');

  SELECT       SUM(months.is_last_month)
           , SUM(months.is_last2_month)
           , (SUM(months.is_last_month) - SUM(months.is_last2_month)) * 100 / SUM(months.is_last2_month)
  FROM       tx                                AS t
 OUTER APPLY (   SELECT CASE WHEN Date_Reported >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0)
                             AND  Date_Reported < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0) THEN 1
                        END AS is_last_month
                      , CASE WHEN Date_Reported >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 2, 0)
                              AND Date_Reported < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0) THEN 1
                        END AS is_last2_month) AS months
 WHERE       t.date_reported >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 2, 0)
   AND       t.date_reported       < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0);

如果您只需要2个月,那么您可以尝试以下查询。否则,您可以添加系列1,2,3,4,5。。。然后用它代替固定整数:

CREATE TABLE tx
(
    status        CHAR(1)
  , date_reported DATE
);

INSERT INTO tx
VALUES ('A', '20180709')
     , ('B', '20180708')
     , ('A', '20180701')
     , ('B', '20180609')
     , ('A', '20180608')
     , ('A', '20180509')
     , ('B', '20180501');

  SELECT       SUM(months.is_last_month)
           , SUM(months.is_last2_month)
           , (SUM(months.is_last_month) - SUM(months.is_last2_month)) * 100 / SUM(months.is_last2_month)
  FROM       tx                                AS t
 OUTER APPLY (   SELECT CASE WHEN Date_Reported >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0)
                             AND  Date_Reported < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0) THEN 1
                        END AS is_last_month
                      , CASE WHEN Date_Reported >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 2, 0)
                              AND Date_Reported < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0) THEN 1
                        END AS is_last2_month) AS months
 WHERE       t.date_reported >= DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 2, 0)
   AND       t.date_reported       < DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0);
试试这个

with CurMon as (
  Select count(status) CurStat
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
  AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)
)
,
 PreMon as (
  Select count(status) PreStat
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-2,0)
  AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
)

select  case when PreStat>0 then 100*(CurStat-  PreStat)/PreStat else 0 end as pct
from CurMon  join PreMon on 1=1
试试这个

with CurMon as (
  Select count(status) CurStat
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
  AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)
)
,
 PreMon as (
  Select count(status) PreStat
  FROM TX 
  WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-2,0)
  AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
)

select  case when PreStat>0 then 100*(CurStat-  PreStat)/PreStat else 0 end as pct
from CurMon  join PreMon on 1=1
使用窗口功能:

with cte as(
select year(Date_reported) as [Year], month(Date_reported) as [Month], count(Status) as [StatusCount]
FROM TX
group by year(Date_reported), month(Date_reported)
)
Select [Year], [Month], [StatusCount]
    , 100.0*([StatusCount] - lag([StatusCount]) OVER (ORDER BY [Year], [Month]))/lag([StatusCount]) OVER (ORDER BY [Year], [Month]) as [PercentageDiff]
from cte
使用窗口功能:

with cte as(
select year(Date_reported) as [Year], month(Date_reported) as [Month], count(Status) as [StatusCount]
FROM TX
group by year(Date_reported), month(Date_reported)
)
Select [Year], [Month], [StatusCount]
    , 100.0*([StatusCount] - lag([StatusCount]) OVER (ORDER BY [Year], [Month]))/lag([StatusCount]) OVER (ORDER BY [Year], [Month]) as [PercentageDiff]
from cte

我建议您在pl/sql函数中执行此操作,因为这样更容易:

DECLARE
FUNCTION  this() RETURN float
IS
    month1 number;
    month2 number;
    increment float;
BEGIN

SELECT COUNT(status)
INTO month1
FROM TX 
WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)

SELECT COUNT(status)
INTO month2
FROM TX 
WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-2,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)

increment = month1 - month2;

RETURN (increment / month1) * 100;
END

如果没有表,仅在一个查询中尝试解决方案是很困难的,我建议您在pl/sql函数中尝试,因为这样更容易:

DECLARE
FUNCTION  this() RETURN float
IS
    month1 number;
    month2 number;
    increment float;
BEGIN

SELECT COUNT(status)
INTO month1
FROM TX 
WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)

SELECT COUNT(status)
INTO month2
FROM TX 
WHERE Date_Reported >= DATEADD(mm,DATEDIFF(mm,0,GETDATE())-2,0)
    AND Date_Reported < DATEADD(mm,DATEDIFF(mm,0,GETDATE())-1,0)

increment = month1 - month2;

RETURN (increment / month1) * 100;
END

如果没有表格,很难在一个查询中尝试解决方案

提供示例数据会很好。提供示例数据会很好。谢谢您的帮助:谢谢您的帮助:谢谢您的帮助:谢谢您的帮助:谢谢您的帮助:谢谢您的帮助:谢谢您的帮助:谢谢您的帮助:@Taz欢迎您,但是我非常想念这些类型抱歉,这只是一个快速的模型谢谢你的帮助:@Taz不客气,但是我非常想念这些类型抱歉,这只是一个快速的模型