Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪里有SQL Server_Sql_Sql Server_Nested - Fatal编程技术网

哪里有SQL Server

哪里有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

我有下面的陈述,其中包括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 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