1.SQLserver分组
ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。
在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,
也需要专门一列用于预先排序以便于进行编号
partition by关键字是分析性函数的一部分,
它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,
partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,分区函数一般与排名函数一起使用。
例:
1.要求:得出每门课程的学生成绩排序(升序)
select * ,row_number() over (partition by c_id order by s_score) from score;
2.得出每门课程的学生成绩,并且按照70分作为分割线排序—即低于70分的排序,高于70分的排序
select * ,row_number() over (partition by c_id,(case when s_score>70 then 1 else 0 end) order by s_score)
from score;
2.SQLserver时间函数
1.将时间装换为指定的格式
CONVERT (VARCHAR(20),t.BEGIN_DATE,23) AS BEGIN_DATE
2.天数相减
DATEDIFF (DAY,T.HANDLE_SUC_DATE,GETDATE()) AS LASTDAY
3.根据指定时间取日期
DATENAME(DAY,T.BEGIN_DATE) AS CYCLEDAY
4.根据指定时间取周几
DATENAME(WEEKDAY,T.BEGIN_DATE) AS CYCLEWEEK
5.根据指定时间取月份
DATEPART(MONTH,T.BEGIN_DATE) AS CYCLEMONTH
6.季度算法
(CASE WHEN DATEPART(MONTH,T.BEGIN_DATE) % 2 =0 THEN 3 ELSE DATEPART(MONTH,T.BEGIN_DATE) % 2 END) AS CYCLEQUARTER
1.动态列
with A AS (
SELECT
A.USER_ID,
A.USER_NAME,
A.LOGIN_NAME,
C.DEPT_ID,
C.DEPT_NAME,
A.SORT,
B.IS_MAIN
FROM
JDP_OU_USER A
INNER JOIN JDP_OU_USERDEPT B
ON A.USER_ID=B.USER_ID
INNER JOIN JDP_OU_DEPT C
ON B.DEPT_ID =C.DEPT_ID
WHERE
A.STATUS = 10 AND
A.USER_ID =‘304’
)
SELECT
DISTINCT
A.USER_ID,
A.USER_NAME,
A.LOGIN_NAME,
STUFF((SELECT ‘,’ + convert(varchar(100),DEPT_ID) FROM A FOR xml path(’’)),1,1,’’) DEPT_ID,
STUFF((SELECT ‘,’ + convert(varchar(100),DEPT_NAME) FROM A FOR xml path(’’)),1,1,’’) AS DEPT_NAME,
A.SORT
FROM A