SQL常用查询,分页,行列转换

1.假如目前有三个表,员工表(EB) ,字段有员工编号(ECODE),姓名(ENAME):考核科目分数表(KB) ,字段有员工编号(ECODE),科目编号(KECODE),分数:科目表(MB) ,字段有科目编号(KECODE),科目名称(KENAME)。

统计每门科目的员工选择科目人数(超过5人的科目才统计),要求输出科目编号和选择科目人数,查询结果按人数降序排序,若人数相同,按科目编号升序排序。


答:解题思路 输出科目编号和选择科目人数 按科目编号分组

SELECT KECODE,COUNT(*) FROM KB GROUP BY KECODE HAVING COUNT(*)>5 ORDER BY COUNT(*) DESC ,KECODE ASC

2.使用分【100-85】【85-70】【70-60】 ,[<60]米统计各科分数,分别统计:各分数段人数,科目编号和科目名称。
答: 解题思路:按分数段分组,先把kb每个分数做一个分数段标识,再按分数段分组

SELECT A.KEcode,MB.KENAME,A.GRADE,COUNT(*) FROM (
SELECT CASE WHEN SCORE >= 85 and SCORE<=100 THEN 'A'

WHEN SCORE >= 75 and SCORE< 85 THEN 'B' 
WHEN SCORE >= 60 and SCORE< 75 THEN 'C'
WHEN SCORE < 60 THEN 'D' END 'GRADE',*
FROM KB ) A LEFT JOIN MB ON A.KECODE =MB.KECODE 
GROUP BY A.GRADE, A.KEcode,MB.KENAME

3.查询维修完全部课程的同学姓名编号
解题思路: 查询 所修科目数 (小于) 科目总数 的学生信息

SELECT * FROM EB WHERE (
(SELECT COUNT(*) FROM KB WHERE EB.ECode=KB.ECODE)
<(SELECT COUNT(*) FROM MB ))

4.行转列(存储过程实现)

 declare @sql varchar(500)
 
set @sql='select userid'
 
select @sql=@sql+',max(case Code when '''+code+''' then Price else 0 end) ['+code+']'
 
from(select distinct code from MobilePhone)a--同from tb group by课程,默认按课程名排序
  print(@sql)
set @sql=@sql+' from MobilePhone group by userid'
 
 print(@sql)
 exec  (@sql)

打印出来的结果:

select userid,max(case Code when 'HWP30' then Price else 0 end) [HWP30],
max(case Code when 'MZ5' then Price else 0 end) [MZ5],
max(case Code when 'XM8' then Price else 0 end) [XM8],
max(case Code when 'XM9' then Price else 0 end) [XM9],
max(case Code when 'XMK20' then Price else 0 end) [XMK20] from MobilePhone group by userid

执行结果如图:这是没有加上max()取最大值,按userid分组

5.分页

CREATE PROCEDURE paging_procedure
@pageIndex int, -- 第几页
@pageSize int  -- 每页包含的记录数
as
begin 
select top (@pageSize) *     -- 这里注意一下,不能直接把变量放在这里,要用select top ()
    from (select row_number() over(order by id desc) as rownumber,* 
            from [dbo].[MobilePhone]) temp_row 
    where rownumber>(@pageIndex-1)*@pageSize;
end

 6. 多行数据拼凑成一格 STUFF函数 类似于 replace(),用于替换字符串的内容, For XML Path 将查询结果集以XML形式展现,将多行的结果,展示在同一行 ,两者可结合使用

https://www.cnblogs.com/liuchenxing/p/9253897.html

select WorkflowSchema,
           ActionName=(STUFF((select ',' + ActionName 
                              from [dbo].[Workflow_Action] a 
                              where a.WorkflowSchema=b.WorkflowSchema for xml path('')),1,1,''))    --where条件必须加上 
    from [dbo].[Workflow_Action] b group by WorkflowSchema

原文地址:https://www.cnblogs.com/LearningFromyou/p/13152732.html