2015-06-29 51 views
0

完整的SQL新手,请亲切。我有以下声明:SELECT DISTINCT创建多行

SELECT DISTINCT 
    tTMPO."OperationRecordID" 
    , tTMPO."CasenoteNumber" 
    , tTMPO."DateTimeBooked" 
    , tSPPS."StartDate" 
    , AEAdm."Visit Date" 
    , AEAdm."Visit Time" 
    , AEAdm."Episode Number" 
    , AEAdm.[Visit Number] 
FROM 
    (("TheatreLive"."dbo"."tblSPPlannedSession" tSPPS 
LEFT OUTER JOIN 
    "TheatreLive"."dbo"."tblTMPlannedOperation" tTMPO ON tSPPS."SessionRecordID" = tTMPO."SessionRecordID") 
LEFT OUTER JOIN 
    "TheatreLive"."dbo"."tblTMActualOperation" tTMAO ON tTMPO."OperationRecordID" = tTMAO."OperationRecordID") 
LEFT OUTER JOIN 
    "TheatreLive"."dbo"."cavAEAdmissions" AEAdm ON tTMAO."CasenoteNumber"=AEAdm."CRN" COLLATE DATABASE_DEFAULT 
WHERE 
    tSPPS."StartDate" < DateAdd(day, 2, AEAdm."Visit Date") 
    AND AEAdm."Visit Date" < tSPPS."StartDate" 

我用DISTINCT但是注意到了OperationRecordID当出现多个集数出现多个行。我尝试添加一个SELECT TOP 1,但需要添加运行异常缓慢的WHERE子句中的完整逻辑。

WHERE条款是为了缩小结果集,因此它只是寻找相互在2天内的日期。

本质上,对于每个不同的OperationRecordID我需要最新的情节编号,并且如果出现多于1个访问编号,那么最高访问编号也是。这两个都应该能够通过MAX子句进行选择。

想法?

+5

'distinct'适用于整个集合,而不是任何单个列。 – jpw

+0

正如@jpw所说,这是预料之中的。你可能想要'分组'。 – leppie

+0

您需要按人排队 – Galma88

回答

0

DISTINCT关键字适用于所有选定的列 - 不仅仅是它出现之前的列。听起来像你可能需要带有GROUP BY的Max函数,或者根据你的标准有多复杂,一个内联表。

喜欢的东西

SELECT 
    tTMPO."OperationRecordID" 
    , tTMPO."CasenoteNumber" 
    , tTMPO."DateTimeBooked" 
    , tSPPS."StartDate" 
    , AEAdm."Visit Date" 
    , AEAdm."Visit Time" 
    , Max(AEAdm."Episode Number") 
    , Max(AEAdm.[Visit Number]) 
FROM 
    (("TheatreLive"."dbo"."tblSPPlannedSession" tSPPS 
LEFT OUTER JOIN 
    "TheatreLive"."dbo"."tblTMPlannedOperation" tTMPO ON tSPPS."SessionRecordID" = tTMPO."SessionRecordID") 
LEFT OUTER JOIN 
    "TheatreLive"."dbo"."tblTMActualOperation" tTMAO ON tTMPO."OperationRecordID" = tTMAO."OperationRecordID") 
LEFT OUTER JOIN 
    "TheatreLive"."dbo"."cavAEAdmissions" AEAdm ON tTMAO."CasenoteNumber"=AEAdm."CRN" COLLATE DATABASE_DEFAULT 
WHERE 
    tSPPS."StartDate" < DateAdd(day, 2, AEAdm."Visit Date") 
    AND AEAdm."Visit Date" < tSPPS."StartDate" 
GROUP BY tTMPO."OperationRecordID" 
    , tTMPO."CasenoteNumber" 
    , tTMPO."DateTimeBooked" 
    , tSPPS."StartDate" 
    , AEAdm."Visit Date" 
    , AEAdm."Visit Time" 
+0

谢谢@amcdermott - 我在某处做了类似的事情,但我仍然发现我得到了多个重复的行,所以我放弃了这个团体的想法。 – JohnM

+0

您会期望DISTINCT返回OperationRecordID,CaseNoteNumber,DateTimeBooked,StartDate,VisitDate,VisitTime的每个唯一组合。 GROUP BY将执行类似的操作 - 不同之处在于它在执行聚合函数时应用。如果字段被复制,因为在某些行中有不同的值,并且您可能希望看到它们。你为什么不解释你的表格结构和你想要查询的内容,我可以看看你。 – amcdermott

0

我修改与以下,试图铲除分隔日期和时间字段重复似乎@amcdermott的代码会导致:

SELECT 
    tTMPO.[OperationRecordID] 
    , tTMPO.[CasenoteNumber] 
    , tTMPO.[DateTimeBooked] 
    , tSPPS.[StartDate] 
/* , AEAdm.[Visit Date] 
    , AEAdm.[Visit Time]*/ 
    , MAX (CONVERT(DATETIME, CONVERT(CHAR(8), AEAdm.[Visit Date], 112) 
    + ' ' + CONVERT(CHAR(8), AEAdm.[Visit Time], 108))) as Visit 
    , MAX(AEAdm.[Episode Number]) as Epi# 
    , MAX(AEAdm.[Visit Number]) as Visit# 
FROM 
    ((TheatreLive.dbo.tblSPPlannedSession tSPPS 
LEFT OUTER JOIN 
    TheatreLive.dbo.tblTMPlannedOperation tTMPO ON tSPPS.SessionRecordID = tTMPO.SessionRecordID) 
LEFT OUTER JOIN 
    TheatreLive.dbo.tblTMActualOperation tTMAO ON tTMPO.OperationRecordID = tTMAO.OperationRecordID) 
LEFT OUTER JOIN 
    TheatreLive.dbo.cavAEAdmissions AEAdm ON tTMAO.CasenoteNumber=AEAdm.CRN COLLATE DATABASE_DEFAULT 
WHERE 
    tSPPS.StartDate < DateAdd(day, 5, AEAdm.[Visit Date]) 
    AND AEAdm.[Visit Date] < tSPPS.StartDate 
GROUP BY tTMPO.OperationRecordID 
    , tTMPO.CasenoteNumber 
    , tTMPO.DateTimeBooked 
    , tSPPS.StartDate 
/* , AEAdm.[Visit Date] 
    , AEAdm.[Visit Time] 
    , AEAdm.[Episode Number]*/ 

这工作!感谢大家。希望代码也更清洁一些;-)告诉你我是一个新手。