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不客气,但是我非常想念这些类型抱歉,这只是一个快速的模型