2014-01-31 32 views
0

我想我的观点,选择最近的“手工处理”续约日期,但无法找到如何把MAX功能在查询可以一MAX在case语句也有CONVERT被合并(VARCHAR

ALTER VIEW [dbo].[cb_TrainingFar] AS 
      SELECT 
       ISNULL(cs_facilities.guid, '00000000-0000-0000-0000-000000000000') AS [FacilityGuid], 
       '' as DART_ALL, 
       ISNULL(cs_facilities.name,'') as [Facility name], 
       ISNULL (ct_workers.forenames,'') + ',' + ISNULL (ct_workers.surname,'') AS 'Name of worker/volunteer', 
       ISNULL (ct_workers.startDate, 0) As 'Start Date', 
        CASE when ct_qualificationTypes.type = 
         'Manual Handling' 
         THEN CONVERT (varchar, ct_qualifications.renewalDate) 
        ELSE 'Not completed' 
       END 'Manual Handling', 
+0

我认为你真的应该也加上你的'FROM'-和'WHERE'-子句 – DrCopyPaste

+0

max是一个聚合函数。你有没有跟随最大值? – xQbert

+0

ALTER VIEW [DBO]。[cb_TrainingFar] AS SELECT ISNULL (cs_facilities.guid, '00000000-0000-0000-0000-000000000000')AS [FacilityGuid], '' 作为DART_ALL, ISNULL(cs_facilities.name, '')as [工具名称], ISNULL(ct_workers.forenames,'')+','+ ISNULL(ct_workers.surname,'')AS'工人/志愿者姓名', ISNULL(ct_workers.startDate,0 ) '开始日期', CASE ct_qualificationTypes.type WHEN '手工处理' 然后将其转换(VARCHAR,ct_qualifications.renewalDate) ELSE '未完成' END '手工处理',请从添加*组ct_workers – user3257545

回答

0

这里的总体思路是你应该能够制定出具体细节:根据您我

0

select case when maxdate > getdate() then 'Fred' else 'Wilma' end Flinstone 
from 
(select id, max(datefield) maxdate 
from sometable 
group by id) temp 

GETDATE()是SQL Server的功能,您没有指定数据库。 nputs

ALTER VIEW [dbo].[cb_TrainingFar] AS 
SELECT 
ISNULL(cs_facilities.guid, '00000000-0000-0000-0000-000000000000') AS [FacilityGuid], 
'' as DART_ALL, 
ISNULL(cs_facilities.name,'') as [Facility name], 
ISNULL (ct_workers.forenames,'') + ',' + ISNULL (ct_workers.surname,'') AS 'Name of worker/volunteer', 
ISNULL (ct_workers.startDate, 0) As 'Start Date', 
CASE 
    ct_qualificationTypes.type 
    WHEN 'Manual Handling' 
    THEN CONVERT (varchar, MAX(ct_qualifications.renewalDate)) 
    ELSE 'Not completed' END AS 'Manual Handling' 
    FROM ct_workers 


    ... 
    GROUP BY ct_qualificationstype 
+0

关闭,但仍然获得两个'手动处理“一个比另一个更老。想要尝试让系统有效地忽略旧记录并给我最近的'更新日期'的记录 – user3257545

+0

在这种情况下,您需要放入一个内部查询,该查询按'ct_qualificationstype'分组并获取'MAX( ct_qualifications.renewalDate)' – DhruvJoshi

0

下面是一个使用窗口函数的一种方法:

ALTER VIEW [dbo].[cb_TrainingFar] AS 
     SELECT 
      ISNULL(cs_facilities.guid, '00000000-0000-0000-0000-000000000000') AS [FacilityGuid], 
      '' as DART_ALL, 
      ISNULL(cs_facilities.name,'') as [Facility name], 
      ISNULL (ct_workers.forenames,'') + ',' + ISNULL (ct_workers.surname,'') AS 'Name of worker/volunteer', 
      ISNULL (ct_workers.startDate, 0) As 'Start Date', 
       CASE when ct_qualificationTypes.type = 
        'Manual Handling' 
        THEN CONVERT(varchar(255), max(ct_qualifications.renewalDate) over()) 
       ELSE 'Not completed' 
      END 'Manual Handling', 

不过,我怀疑你的问题,需要更好地理解查询。查询的其余部分是什么样的?顺便说一句,请不要使用varchar而不是长度。默认长度根据上下文而变化,并且依赖于默认长度足够长是相当危险的。

+0

查询正在查看员工记录以了解员工是否已完成各种培训课程,如果有的话,他们最近的更新日期是什么,因为每次他们重新参加课程时都会有新记录 – user3257545

+0

@ user3257545。 。 。如图所示,您将为每个续订日期分别获取一行,而不是每个员工一行。你不能在'select'子句中解决这个问题。 –

+0

我确实担心可能是这样,感谢您对此的帮助,帮助我更多了解了更多的东西 – user3257545