我正在使用Microsoft SQL Server 2005,需要对星期二符合我们50+锦标赛资格的玩家进行分析 - >要获得参赛资格,他们需要在周一下午2点之前的周一或周二获得5分以上,并且积分不是累积的(必须在周一或周二下午2点之前获得最少5分)。我正在使用的代码如下,但到目前为止只包含特定星期一和星期二的日期范围。我需要在2个月的时间内完成周一和周二的所有活动。我是新手(有点因为额外的职责而被扔在我的腿上,所以我必须在飞行中学习)......
到目前为止,正如我所说,我已经能够自己获得所需的所有信息,但仅限于1周。到目前为止,我在网上找到的所有东西都比我能解释的更令人困惑,没有人引用我提供的代码,而是给了我全新的代码,我无法使用......
SELECT
dbo.CombinedPts.Account, dbo.CombinedPts.FirstName,
dbo.CombinedPts.LastName,
ISNULL(dbo.CombinedPts.EGSPts, 0) AS EGS,
ISNULL(dbo.CombinedPts.IRPts, 0) AS IR,
DATENAME(dw, dbo.CombinedPts.Date) AS WkDay,
DATEDIFF(YY, dbo.PlayerMaster.Birthdate, {fn current_date()}) - CASE WHEN (MONTH(dbo.PlayerMaster.Birthdate)=MONTH({fn current_date()}) AND DAY(dbo.PlayerMaster.Birthdate) > DAY({fn current_date()}) OR MONTH (dbo.PlayerMaster.Birthdate) > MONTH ({fn current_date()})) THEN 1 ELSE 0 END AS Age
FROM
dbo.CombinedPts, dbo.PlayerMaster
WHERE
(DATEDIFF(YY, dbo.PlayerMaster.Birthdate, {fn current_date()}) >= 50)
AND (dbo.CombinedPts.EGSPts >= 5 OR dbo.CombinedPts.IRPts >= 5)
AND (dbo.CombinedPts.Account = dbo.PlayerMaster.Account)
AND (Date BETWEEN '10/11/2010 00:00:00' AND '10/11/2010 13:59:59' OR Date BETWEEN '10/12/2010 00:00:00' AND '10/12/2010 13:59:59')
AND (DATEPART(dw, dbo.CombinedPts.Date) = 2 OR DATEPART(dw, dbo.CombinedPts.Date) = 3)
GROUP BY
dbo.CombinedPts.Account,
dbo.CombinedPts.FirstName,
dbo.CombinedPts.LastName,
DATENAME(dw, dbo.CombinedPts.Date),
dbo.CombinedPts.EGSPts,
dbo.CombinedPts.IRPts,
dbo.PlayerMaster.Birthdate
ORDER BY
dbo.CombinedPts.Account
作为旁注,在我们的SQL Server 2005中,我没有权限创建子查询(我已成为UNION ALL的狂热用户 - >到目前为止在查询中证明无用)也没有生成表的权限,所以我所做的一切都必须在一个查询中...到目前为止,所有有用的帮助都是使用表和子查询。
答案 0 :(得分:0)
我不是100%明确你想要达到的目标。
我想你想要这样的东西:
select *
from CombinedPts
where CombinedPts.Date > start_of_contest
and CombinedPts.Date < end_of_contest
and ( datepart( dw, CombinedPts.Date ) = 2 or datepart( h, CombinedPts.Date ) < 14 )
and ( datepart( dw, CombinedPts.Date ) = 3 or datepart( h, CombinedPts.Date ) < 14 )
having sum( CombinedPts.EGSPts ) >= 5
此处使用Datepart确保它在正确的日期和时间。
答案 1 :(得分:0)
这是一个有点不同的结构,但大致相同。我使用别名而不是完整的引用。它也是未经测试的,但干净地解析。
AND DATEDIFF(m,cp.Date,GETDATE()) < 2
为您提供2个月的窗口。
编辑 - 添加了日期和时间的条款。 AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14)
仅在下午2:00(1400小时)后的周一和周二为您提供
SELECT cp.Account
, cp.FirstName
, cp.LastName
, ISNULL(cp.EGSPts,0) AS EGS
, ISNULL(cp.IRPts,0) AS IR
, DATENAME(dw, cp.Date) AS WkDay
, DATEDIFF(YY, pm.Birthdate, GETDATE())
- CASE WHEN (MONTH(pm.Birthdate) = MONTH(GETDATE())
AND DAY(pm.Birthdate) > DAY(GETDATE())
OR MONTH (pm.Birthdate) > MONTH (GETDATE()) )
THEN 1
ELSE 0
END AS Age
FROM dbo.CombinedPts cp
join dbo.PlayerMaster pm on cp.Account = pm.Account
WHERE DATEDIFF(YY, pm.Birthdate, GETDATE()) >= 50
AND (cp.EGSPts >= 5 OR cp.IRPts >= 5)
AND (DATEPART(dw, cp.Date) in (2,3) AND DATEPART(hh,cp.Date) > 14)
AND DATEDIFF(m,cp.Date,GETDATE()) < 2
GROUP BY cp.Account
, cp.FirstName
, cp.LastName
, DATENAME(dw, cp.Date)
, cp.EGSPts
, cp.IRPts
, pm.Birthdate
ORDER BY cp.Account