Как поставить дополнительное условие в предложении выбора в SQL Server 2008 - PullRequest
0 голосов
/ 07 марта 2011

У меня следующий запрос: для каждого FacilityCode я получаю LastCompletedOn и LastEDAOn.

SELECT  Code ,
        MAX(DATEADD(HOUR, Seed_TimeZone.DifferenceFromUTC, CompletedOn)) 'LastCompletedOn' ,
        MAX(DATEADD(HOUR, Seed_TimeZone.DifferenceFromUTC,LastUpdateDemographicsDate)) 'LastEDAOn'
FROM    PatientCharts WITH ( NOLOCK )
        INNER JOIN Facilities WITH ( NOLOCK ) ON Facilities.FacilityId = PatientCharts.FacilityId
        INNER JOIN Seed_TimeZone WITH ( NOLOCK ) ON Seed_TimeZone.TimeZoneId =      Facilities.TimeZoneId

WHERE   Facilities.IsActive = 1
        AND PatientCharts.IsDeleted = 0
        AND PatientCharts.IsErroneous = 0
        --AND dbo.PatientCharts.ChartStatusID=1
GROUP BY Code

Я хочу поместить закомментированное условие "AND dbo.PatientCharts.ChartStatusID = 1" в LastCompletedOn.Я попытался поместить весь запрос как подзапрос, но одно и то же значение повторяется для каждого кода объекта.Как это сделать.

ОТВЕТ

Ответ, предложенный srgerg, работает нормально.Однако мы можем получить тот же результат, используя дополнительное соединение

SELECT  Code ,       
        MAX(DATEADD(HOUR, DifferenceFromUTC, compOn.CompletedOn)) 'LastCompletedOn' ,
        MAX(DATEADD(HOUR, DifferenceFromUTC,Prim.LastUpdateDemographicsDate)) 'LastEDAOn'
FROM    PatientCharts AS Prim WITH ( NOLOCK )
        INNER JOIN Facilities WITH ( NOLOCK ) ON Facilities.FacilityId = Prim.FacilityId
        INNER JOIN Seed_TimeZone LEO WITH ( NOLOCK ) ON LEO.TimeZoneId = 
  Facilities.TimeZoneId 
        LEFT OUTER JOIN PatientCharts compOn ON compOn.PatientChartId = prim.PatientChartId AND compOn.ChartStatusID=1      
WHERE   Facilities.IsActive = 1
        AND Prim.IsDeleted = 0
        AND Prim.IsErroneous = 0        
GROUP BY Code

1 Ответ

0 голосов
/ 07 марта 2011

Вы можете попробовать что-то вроде этого:

SELECT  Code ,
        MAX(CASE PatientCharts.ChartStatusID
            WHEN 1 THEN DATEADD(HOUR, Seed_TimeZone.DifferenceFromUTC, CompletedOn)
            ELSE CONVERT(DATETIME, '1-Jan-1900') END) 'LastCompletedOn' ,
        MAX(DATEADD(HOUR, Seed_TimeZone.DifferenceFromUTC,LastUpdateDemographicsDate)) 'LastEDAOn'
FROM    PatientCharts WITH ( NOLOCK )
        INNER JOIN Facilities WITH ( NOLOCK ) ON Facilities.FacilityId = PatientCharts.FacilityId
        INNER JOIN Seed_TimeZone WITH ( NOLOCK ) ON Seed_TimeZone.TimeZoneId = Facilities.TimeZoneId
WHERE   Facilities.IsActive = 1
        AND PatientCharts.IsDeleted = 0
        AND PatientCharts.IsErroneous = 0
        --AND dbo.PatientCharts.ChartStatusID=1
GROUP BY Code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...