1。行列转换问题:假设有一个学生成绩表(tb)如下:想变成(得到如下结果):代码:WITHtb(name,course,score)AS(SELECTN'张三',N'语文',74UNIONALLSELECTN'张三',N'数学',83UNIONALLSELECTN'张三',N'物理',93UNIONALLSELECTN'李四',N'语文',79UNIONALLSELECTN'李四',N'数学',86UNIONALLSELECTN'李四',N'物理',88)SELECTname,MAX(CASEcourseWHEN'Chinese'THENscoreELSE0END)Chinese,MAX(CASEcourseWHEN'Mathematics'THENscoreELSE0END)Mathematics,MAX(CASEcourseWHEN'Physics'THENscoreELSE0END)PhysicsFROMtbGROUPBYname2.分页方案1:使用NOTIN和SELECTTOP分页报表形式。SELECTTOP10*FROMTestTableWHEREIDNOTIN(SELECTTOP20IDFROMTestTableORDERBYID)ORDERBYID方案二:使用ID大于多少和SELECTTOP分页语句形式。SELECTTOP10*FROMTestTableWHEREID>(SELECTMAX(id)FROM(SELECTTOP20idFROMTestTableORDERBYid)AST)ORDERBYID方案三:使用SQLServer中的ROW_NUMBER特性进行分页。SELECT*FROM(SELECTROW_NUMBER()OVER(ORDERBYIDDESC)ASROWID,*FROMTestTable)ASmytablewhereROWID介于21和403之间。结果被合并,重复的行被合并。SELECT*FROMAUNIONSELECT*FROMB不合并重复行。SELECT*FROMAUNIONALLSELECT*FROMB4,随机排序SELECT*FROMTestTableORDERBYNEWID()也可以结合TOP随机取前N条记录。SELECTTOP100*FROMTestTableORDERBYNEWID()5.两边数据用任意符号隔开。例如,如果我们用逗号(,)分隔数据,则数据将如下所示。分为下图:SELECTR,CASEWHENCHARINDEX(',',R)>1THENLEFT(R,CHARINDEX(',',R)-1)ELSENULLENDASR1,CASEWHENCHARINDEX(',',R)>1THENRIGHT(R,(LEN(R)-CHARINDEX(',',R)))ELSENULLENDASR2FROMt代码比较长,我们拆分代码来理解:SELECTCHARINDEX(',',',')--结果为1SELECTCHARINDEX(',','NULL')--结果为0SELECTCHARINDEX(',','')--结果为0SELECTCHARINDEX(',','A,B')--resultis2SELECTLEN('A,B')--resultis3SELECTLEN('A,B')-CHARINDEX(',','A,B')--结果为3-2=1SELECTRIGHT('A,B',(LEN('A,B')-CHARINDEX(',','A,B')))--结果为B最后一步我们将'A,B'拆分出B,同样我们可以用类似的方式得到A。6.WAITFOR延迟执行示例等待1小时2分3秒后执行SELECT语句。WAITFORDELAY'01:02:03'SELECT*FROMEmployee其中DELAY是延迟多久开始执行。示例等到晚上11:08之后执行SELECT语句。WAITFORTIME'23:08:00'SELECT*FROMEmployee,其中TIME是要等到特定的时间才开始执行。原文地址:https://mp.weixin.qq.com/s/Xb4MIHnrRtIYFs5xZwhYtg
