基于当月的动态 SQL 查询
Dynamic SQL query which is based on current month
下面是一个 SQL 代码,它从每月数据摘要的联合中创建一个 table:
-- Oct 2017
select distinct a.device_id ,201710 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2017-10-01' and a.EFFTV <'2017-10-31'
union
-- Nov 2017
select distinct a.device_id ,201711 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2017-11-01' and a.EFFTV <'2017-11-30'
union
-- Dec 2017
select distinct a.device_id ,201712 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2017-12-01' and a.EFFTV <'2017-12-31'
union
-- Jan 2018
select distinct a.device_id ,201801 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2018-01-01' and a.EFFTV <'2018-01-31'
这将是每月 运行 并且基于当前月份,我们需要从上个月 - 1,向后提取 3 个月的数据。
例如,如果 2 月的 运行 应该从 10 月到 12 月,如果 3 月的 运行 应该从 11 月到 1 月。
这将基于当月,但有人可以帮我实现自动化吗?
需要当前月份并返回的内容 - 1 然后从那里再返回 3 个月。
虽然日期计算并不复杂,但是如何使查询根据当前月份动态变化?
假设这是 SQL SERVER 2005+:
-- Oct 2017
select distinct a.device_id
,CONCAT(CAST(YEAR(a.expired) AS varchar(4)),right('00'+CAST(MONTH(a.expired) AS nvarchar(2)), 2)) as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from @test a
where CONVERT(date, a.expired) >= DATEADD(month, DATEDIFF(month, 0, convert(date, DATEADD(MONTH, -3, GETDATE()))), 0)
下面是一个 SQL 代码,它从每月数据摘要的联合中创建一个 table:
-- Oct 2017
select distinct a.device_id ,201710 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2017-10-01' and a.EFFTV <'2017-10-31'
union
-- Nov 2017
select distinct a.device_id ,201711 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2017-11-01' and a.EFFTV <'2017-11-30'
union
-- Dec 2017
select distinct a.device_id ,201712 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2017-12-01' and a.EFFTV <'2017-12-31'
union
-- Jan 2018
select distinct a.device_id ,201801 as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from dbo.DEVICE_HIST a
where a.expired >= '2018-01-01' and a.EFFTV <'2018-01-31'
这将是每月 运行 并且基于当前月份,我们需要从上个月 - 1,向后提取 3 个月的数据。 例如,如果 2 月的 运行 应该从 10 月到 12 月,如果 3 月的 运行 应该从 11 月到 1 月。 这将基于当月,但有人可以帮我实现自动化吗?
需要当前月份并返回的内容 - 1 然后从那里再返回 3 个月。 虽然日期计算并不复杂,但是如何使查询根据当前月份动态变化?
假设这是 SQL SERVER 2005+:
-- Oct 2017
select distinct a.device_id
,CONCAT(CAST(YEAR(a.expired) AS varchar(4)),right('00'+CAST(MONTH(a.expired) AS nvarchar(2)), 2)) as month_id,
case when group_descr in ('BASE') then 'Basic'
when group_descr in ('VALUES') then 'Valuable'
when group_descr in ('PREFERRENCE') then 'Preferr'
else 'Other'
end as Class
from @test a
where CONVERT(date, a.expired) >= DATEADD(month, DATEDIFF(month, 0, convert(date, DATEADD(MONTH, -3, GETDATE()))), 0)