复杂的行列转换(列转置),加判断条件为输出状态

原帖:http://blog.csdn.net/htl258/archive/2010/04/01/5439807.aspx

 

原贴:

http://topic.csdn.net/u/20100330/07/74b9f2eb-d20f-45c1-b197-a39e7a47fe7f.html?seed=86569699&r=64344385#r_64344385

这是一个证书考试记录系统,每个学生都要通过考试获得证书,每个证书都有失效日期。
1,如果学生目前所有证书(3个)都在有效期内(当前系统时间)则显示状态为’正常‘;
2,如果有证书失效,但是此学生参加了新的课程(且早于当前系统时间),则状态显示为'正常';
3,如果有证书失效,且没有新课程,则显示学生状态'失效'.

当前系统时间 1/21/2010

数据集:

学生ID 学生姓名 证书名称 上次考证时间 失效日期 新课时间
SID Sname Qulification LastDate DueDate NewClass

-----------------------------
0342S aa CCDF 1/23/2010 1/19/2010 2/1/2010
0748T bb RTDF 1/22/2010 5/22/2010 2/1/2010
0748T bb CCDF Null 5/22/2010 2/1/2010
0748T bb FDO Null 5/22/2010 2/1/2010
55576 cc CCDF 4/22/2008 4/29/2010 2/1/2010
55576 cc FDO 4/22/2008 4/29/2010 2/1/2010
55576 cc RTDF 4/22/2008 4/29/2010 2/1/2010
64221 dd RTDF 1/20/2010 5/22/2010 2/1/2010

希望输出结果
学生ID 姓名 RTDF上次 RTDF失效 CCDF上次 CCDF失效 FDO上次 FDO失效 状态
SID Sname RTDF_Comp RTDF_Due CCDF_Completed CCDF_Due FDO_Completed FDO_Due Status

------------------------------------------------------
0342S aa No Class No Class 1/23/2010 1/19/2010 No Class No Class Expire
55576 cc 4/22/2008 4/29/2010 4/22/2008 4/29/2010 4/22/2008 4/29/2010 Current
0748T bb 1/22/2010 5/22/2010 New Class 5/22/2010 New Class 5/22/2010 Current
64221 dd 1/20/2010 5/22/2010 No Class No Class No Class No Class Expire

代码处理过程:

-- ------------------------------------------------------------------------
--
  Author : htl258(Tony)
--
  Date   : 2010-04-01 07:19:04
--
  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
--
          Jul  9 2008 14:43:34
--
          Copyright (c) 1988-2008 Microsoft Corporation
--
          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--
------------------------------------------------------------------------
--
> 生成测试数据表:tb

IF NOT OBJECT_ID ( ' [tb] ' ) IS NULL
   
DROP TABLE [ tb ]
GO
CREATE TABLE [ tb ] ( [ SID ] NVARCHAR ( 10 ), [ Sname ] NVARCHAR ( 10 ), [ Qulification ] NVARCHAR ( 10 ), [ LastDate ] DATETIME , [ DueDate ] DATETIME , [ NewClass ] DATETIME )
INSERT [ tb ]
SELECT ' 0342S ' , ' aa ' , ' CCDF ' ,N ' 1/23/2010 ' ,N ' 1/19/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 0748T ' , ' bb ' , ' RTDF ' ,N ' 1/22/2010 ' ,N ' 5/22/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 0748T ' , ' bb ' , ' CCDF ' , NULL ,N ' 5/22/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 0748T ' , ' bb ' , ' FDO ' , NULL ,N ' 5/22/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 55576 ' , ' cc ' , ' CCDF ' ,N ' 4/22/2008 ' ,N ' 4/29/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 55576 ' , ' cc ' , ' FDO ' ,N ' 4/22/2008 ' ,N ' 4/29/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 55576 ' , ' cc ' , ' RTDF ' ,N ' 4/22/2008 ' ,N ' 4/29/2010 ' ,N ' 2/1/2010 ' UNION ALL
SELECT ' 64221 ' , ' dd ' , ' RTDF ' ,N ' 1/20/2010 ' ,N ' 5/22/2010 ' ,N ' 2/1/2010 '
GO
-- SELECT * FROM [tb]

-- >SQL查询如下:

DECLARE @S VARCHAR ( 8000 )
SELECT @S = ' SELECT SID,[Sname] '
SELECT @S = @S + ' ,MIN(CASE WHEN [Qulification]= ''' + [ Qulification ] + ''' AND [NewClass] IS NULL THEN ISNULL(CONVERT(VARCHAR,[LastDate],111), '' NO CLASS '' )
                        WHEN [Qulification]=
''' + [ Qulification ] + ''' AND [NewClass] IS NOT NULL THEN ISNULL(CONVERT(VARCHAR,[LastDate],111), '' NEW CLASS '' )
                        ELSE
'' No Class '' END)[ ' + [ Qulification ] + ' 上次] ' +
           
+ ' ,MIN(CASE WHEN [Qulification]= ''' + [ Qulification ] + ''' THEN CONVERT(VARCHAR,[DueDate],111) ELSE '' No Class '' END)[ ' + [ Qulification ] + ' 失效] '
FROM ( SELECT [ QULIFICATION ] FROM TB GROUP BY CHARINDEX ( LEFT ( [ QULIFICATION ] , 1 ), ' RCF ' ), [ QULIFICATION ] ) T
SELECT @S = @S + ' ,Status=CASE SUM(CASE WHEN [DueDate]>GETDATE() OR ([DueDate]<GETDATE() AND ISNULL([NewClass],0)>GETDATE()) THEN 1 ELSE 0 END) WHEN 3 THEN '' Current '' ELSE '' Expire '' END
            FROM TB --WHERE Sname<>
'' AA ''
            GROUP BY SID,[Sname]
'            
EXEC ( @S )
/*
SID      Sname  RTDF上次     RTDF失效         CCDF上次       CCDF失效        FDO上次        FDO失效            Status
--------  -------  ----------        ----------          ----------          ----------         ----------          -------------       -----------
0342S    aa   No Class         No Class        2010/01/23    2010/01/19    No Class          No Class        Expire
0748T    bb   2010/01/22    2010/05/22    NEW CLASS    2010/05/22    NEW CLASS    2010/05/22    Current
55576    cc    2008/04/22    2010/04/29    2008/04/22    2010/04/29    2008/04/22    2010/04/29    Current
64221    dd   2010/01/20    2010/05/22    No Class          No Class        No Class         No Class        Expire

(4 行受影响)
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值