有两张表 TB1 TB2
TB1结构
name(唯一) cdate
AA 2005/10/15
BB 2006/11/30
TB2结构
name(有重复) date TTL
AA 2008/10/15 10
AA 2008/11/30 11
AA 2007/10/10 5
BB 2009/11/23 11
BB 2008/11/30 10
BB 2009/10/10 6
*******************************************************************
假设当前时间为2009-11-24,则n=11月24 Y=2009
1.如果n<cdate 则m1=(Y-1)/cdate(月/日) m2=Y/cdate(月/(日-1))
2.如果n>=cdate 则m1=Y/cdate(月/日) m2=(Y+1)/cdate(月/(日-1))
select sum(TTL) as 和 from TB2 where date between m1 and m2结果如下:
name 时间段 和
AA 2009/10/15 to 2010/10/14 22
BB 2008/11/30 to 2009/11/29 16请教大家这个结果该怎么得到,变量比较多,希望大家指导下,谢谢!
TB1结构
name(唯一) cdate
AA 2005/10/15
BB 2006/11/30
TB2结构
name(有重复) date TTL
AA 2008/10/15 10
AA 2008/11/30 11
AA 2007/10/10 5
BB 2009/11/23 11
BB 2008/11/30 10
BB 2009/10/10 6
*******************************************************************
假设当前时间为2009-11-24,则n=11月24 Y=2009
1.如果n<cdate 则m1=(Y-1)/cdate(月/日) m2=Y/cdate(月/(日-1))
2.如果n>=cdate 则m1=Y/cdate(月/日) m2=(Y+1)/cdate(月/(日-1))
select sum(TTL) as 和 from TB2 where date between m1 and m2结果如下:
name 时间段 和
AA 2009/10/15 to 2010/10/14 22
BB 2008/11/30 to 2009/11/29 16请教大家这个结果该怎么得到,变量比较多,希望大家指导下,谢谢!
DECLARE @curdate datetime
SET @curdate='2009-11-24';WITH CTE
AS
(
SELECT *, CASE WHEN SUBSTRING(CONVERT(varchar(10),@curdate,120),6,5)
<SUBSTRING(CONVERT(varchar(10),cdate,120),6,5) THEN
CAST(YEAR(@curdate)-1 AS VARCHAR(10)) +'-'+SUBSTRING(CONVERT(varchar(10),cdate,120),6,5)
ELSE
CAST(YEAR(@curdate) AS VARCHAR)+'-'+SUBSTRING(CONVERT(varchar(10),cdate,120),6,5)
END M1, CASE WHEN SUBSTRING(CONVERT(varchar(10),@curdate,120),6,5)
>=SUBSTRING(CONVERT(varchar(10),cdate,120),6,5) THEN
CAST(YEAR(@curdate) AS VARCHAR)+'-'+SUBSTRING(CONVERT(varchar(10),DATEADD(D,-1,cdate),120),6,5) ELSE
CAST(YEAR(@curdate)+1 AS VARCHAR)+'-'+SUBSTRING(CONVERT(varchar(10),DATEADD(D,-1,cdate),120),6,5)
END M2 FROM TB1
)
SELECT * FROM TB2 WHERE date between
(SELECT M1 FROM CTE WHERE NAME=TB2.NAME)
and
(SELECT M2 FROM CTE WHERE NAME=TB2.NAME)
楼主你给的结果好像有问题,表2中AA根本没有2009/10/15 to 2010/10/14 这个时间段的记录, 怎么你最终结果跑出来了呢??-- =============================================
-- Author: T.O.P
-- Create date: 2009/11/24
-- Version: SQL SERVER 2005
-- =============================================
declare @TB1 table([name] varchar(2),[cdate] datetime)
insert @TB1
select 'AA','2005/10/15' union all
select 'BB','2006/11/30'declare @TB2 table([name] varchar(2),[date] datetime,[TTL] int)
insert @TB2
select 'AA','2008/10/15',10 union all
select 'AA','2009/11/30',11 union all
select 'AA','2007/10/10',5 union all
select 'BB','2010/11/23',11 union all
select 'BB','2010/08/30',10 union all
select 'BB','2009/10/10',6
SELECT [name], CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,CDATE) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M1,
CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M2
FROM @TB1
SELECT A.NAME, CONVERT(NVARCHAR(12),A.M1,111)+' TO '+CONVERT(NVARCHAR(12),A.M1,111) AS 时间段, SUM(B.[TTL])
FROM (
SELECT [name], CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,CDATE) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M1,
CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M2
FROM @TB1
) AS A INNER JOIN @TB2 B ON A.[name]=B.[name]
WHERE B.[date] BETWEEN M1 AND M2
GROUP BY A.NAME, A.M1, A.M2--测试结果:
/*
name M1 M2
---- ----------------------- -----------------------
AA 2009-10-15 00:00:00.000 2010-10-14 00:00:00.000
BB 2009-11-30 00:00:00.000 2010-11-29 00:00:00.000(2 row(s) affected)NAME 时间段
---- ---------------------------- -----------
AA 2009/10/15 TO 2009/10/15 11
BB 2009/11/30 TO 2009/11/30 21(2 row(s) affected)*/
上面的时间段搞错了
-- =============================================
-- Author: T.O.P
-- Create date: 2009/11/24
-- Version: SQL SERVER 2005
-- =============================================
declare @TB1 table([name] varchar(2),[cdate] datetime)
insert @TB1
select 'AA','2005/10/15' union all
select 'BB','2006/11/30'declare @TB2 table([name] varchar(2),[date] datetime,[TTL] int)
insert @TB2
select 'AA','2008/10/15',10 union all
select 'AA','2009/11/30',11 union all
select 'AA','2007/10/10',5 union all
select 'BB','2010/11/23',11 union all
select 'BB','2010/08/30',10 union all
select 'BB','2009/10/10',6
SELECT [name], CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,CDATE) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M1,
CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M2
FROM @TB1
SELECT A.NAME, CONVERT(NVARCHAR(12),A.M1,111)+' TO '+CONVERT(NVARCHAR(12),A.M2,111) AS 时间段, SUM(B.[TTL])
FROM (
SELECT [name], CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,CDATE) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M1,
CAST((case
when getdate()>=[cdate] then CAST(DATEPART(YEAR,DATEADD(YY,1,GETDATE())) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
ELSE CAST(DATEPART(YEAR,GETDATE()) AS NVARCHAR(10))+'-'+CAST(DATEPART(MM,CDATE) AS NVARCHAR(10))+'-'+CAST(DATEPART(DD,DATEADD(DD,-1,CDATE)) AS NVARCHAR(10))
end) AS DATETIME) AS M2
FROM @TB1
) AS A INNER JOIN @TB2 B ON A.[name]=B.[name]
WHERE B.[date] BETWEEN M1 AND M2
GROUP BY A.NAME, A.M1, A.M2--测试结果:
/*
name M1 M2
---- ----------------------- -----------------------
AA 2009-10-15 00:00:00.000 2010-10-14 00:00:00.000
BB 2009-11-30 00:00:00.000 2010-11-29 00:00:00.000(2 row(s) affected)NAME 时间段
---- ---------------------------- -----------
AA 2009/10/15 TO 2010/10/14 11
BB 2009/11/30 TO 2010/11/29 21(2 row(s) affected)*/
如果我把ta1的第二列时间改成2006/11/22,应该比当前11/24小,所以它应该统计
2008/11/22 to 2009/11/22 之间的数据,结果TTL=6,但是按照你的语句结果还是10
再次请教。