哪里有SQL Server
我有下面的陈述,其中包括80岁以上的客户哪里有SQL Server,sql,sql-server,nested,Sql,Sql Server,Nested,我有下面的陈述,其中包括80岁以上的客户 SELECT C.ClientID, C.surname + C.forename As Name, CONVERT(VARCHAR(10), C.DateOfBirth, 103) AS DOB, S.SchemeID, [Status] FROM vClients C INNER JOIN vClientSchemes S ON C.ClientID = S.ClientID INNER
SELECT
C.ClientID,
C.surname + C.forename As Name,
CONVERT(VARCHAR(10), C.DateOfBirth, 103) AS DOB,
S.SchemeID,
[Status]
FROM
vClients C
INNER JOIN
vClientSchemes S ON C.ClientID = S.ClientID
INNER JOIN
vEvents E ON C.ClientId = E.ClientID
WHERE
(DATEDIFF(yy, C.DateOfBirth, GetDate()) -
CASE WHEN((MONTH(DateOfBirth) * 100 + DAY(C.DateOfBirth)) > (MONTH(GetDate()) * 100 + DAY(GetDate())))
THEN 1 ELSE 0 END) > 80
AND (DATEDIFF(yy, DateOfBirth, GetDate()) -
CASE WHEN((MONTH(DateOfBirth) * 100 + DAY(C.DateOfBirth)) >
(MONTH(GetDate()) * 100 + DAY(GetDate())))
THEN 1 ELSE 0 END) < 100
AND C.[Status] = 0
AND S.SchemeID = 3
因此,从事件日期开始,使用以下查询。到目前为止我有
SELECT ClientID
FROM vEvents
WHERE EventDate > DATEADD(year,-1,GETDATE())
但是我似乎无法链接这两个查询看起来您已经可以通过别名
E
访问查询中的vEvents
表。您应该能够通过添加以下内容来添加所指示的筛选器:
AND E.EventDate > DATEADD(year, -1, GETDATE())
由于内部联接,并且您已经选择了它,
ClientID
应该与vEvents
表中的vClients
相同。您的where谓词是不可争辩的,因为您已经在函数中包装了列。你可以把它做成SARGable,简单得多
WHERE DateOfBirth < DATEADD(Year, -80, cast(getdate() as date)
AND DateOfBirth > DATEADD(Year, -100, cast(getdate() as date)
AND C.[Status] = 0
AND S.SchemeID = 3
WHERE dateof birthDATEADD(年份,-100,强制转换(getdate()为日期)
和C[状态]=0
S.SchemeID=3
对于您的实际问题,您可以使用MAX(EventDate)并按其余列分组,也可以使用ROW_NUMBER。Yep marc_2您是对的,只需要添加条件和一个distinct,但删除EventDate上的select
SELECT
distinct C.ClientID,
C.surname + C.forename As Name,
CONVERT(VARCHAR(10), C.DateOfBirth, 103) AS DOB
FROM vClients C
inner join vClientSchemes S on C.ClientID = S.ClientID
inner join vEvents E ON C.ClientId = E.ClientID
WHERE
(DATEDIFF(yy,C.DateOfBirth,GetDate()) -
CASE WHEN((MONTH(DateOfBirth)*100 + DAY(C.DateOfBirth)) > (MONTH(GetDate())*100 + DAY(GetDate()))) THEN 1 ELSE 0 END)> 80
AND (DATEDIFF(yy,DateOfBirth,GetDate()) - CASE WHEN((MONTH(DateOfBirth)*100 + DAY(C.DateOfBirth)) > (MONTH(GetDate())*100 + DAY(GetDate()))) THEN 1 ELSE 0 END) <100
AND C.[Status] = 0 AND S.SchemeID = 3 AND EventDate > DATEADD(year,-1,GETDATE()) order by C.clientid
选择
独特的C.ClientID,
C.姓+C.名作为名字,
将(VARCHAR(10),C.DateOfBirth,103)转换为DOB
来自vClients C
C.ClientID=S.ClientID上的内部联接vClientSchemes
C.ClientId=E.ClientId上的内部连接V
哪里
(DATEDIFF(yy,C.DateOfBirth,GetDate())-
当((月(出生日期)*100+天(C.出生日期))>(月(GetDate())*100+天(GetDate())时,则1其他0结束)>80
和(DATEDIFF(yy,DateOfBirth,GetDate())-CASE WHEN((月(出生日期)*100+天(C.DateOfBirth))>(月(GetDate())*100+天(GetDate())然后1其他0结束)DATEADD(年,-1,GetDate())按C.clientid排序
您的查询已经包含vEvents表,为什么您不能将所需的列添加到SELECT并将条件添加到WHERE?我不明白问题出在哪里。您可以只添加Max(例如EventDate)
要选择并添加另一个字段的分组依据
,如果我将所需列添加到选择中,则事件表将返回多个客户端id,因为每个客户端都有多个事件,例如,如果没有事件,我将为自服务启动以来使用的所有客户端获取727行。如果我将该条件添加到here子句并使用distinct,我得到2572行,换句话说,它应该小于727行
SELECT
distinct C.ClientID,
C.surname + C.forename As Name,
CONVERT(VARCHAR(10), C.DateOfBirth, 103) AS DOB
FROM vClients C
inner join vClientSchemes S on C.ClientID = S.ClientID
inner join vEvents E ON C.ClientId = E.ClientID
WHERE
(DATEDIFF(yy,C.DateOfBirth,GetDate()) -
CASE WHEN((MONTH(DateOfBirth)*100 + DAY(C.DateOfBirth)) > (MONTH(GetDate())*100 + DAY(GetDate()))) THEN 1 ELSE 0 END)> 80
AND (DATEDIFF(yy,DateOfBirth,GetDate()) - CASE WHEN((MONTH(DateOfBirth)*100 + DAY(C.DateOfBirth)) > (MONTH(GetDate())*100 + DAY(GetDate()))) THEN 1 ELSE 0 END) <100
AND C.[Status] = 0 AND S.SchemeID = 3 AND EventDate > DATEADD(year,-1,GETDATE()) order by C.clientid