行转列(case when 或者 pivot)
接到一个需求,查询每张表的汇总数据,并且汇成一行显示
case when的方式,先对数据分组,出参里根据某个字段进行判断
|
|
附上查询结果:
pivot的方式,这是sqlserver提供的一种函数,大致语法为:
|
|
附上查询结果:
列转行 (for xml path [(‘code’)])
将多条数据并成一条xml格式数据,并且每个字段都会成为一个元素标签。
如果code不为空并则每条数据最外层再套上一层code标签。
数据库表结构如下:
序号 | hobbyID | hName |
---|---|---|
1 | 1 | 爬山 |
2 | 2 | 游泳 |
3 | 3 | 美食 |
|
|
如果code为空则每条数据最外层不套上标签12345678SELECT * FROM @hobby FOR XML PATH('')运行结果如下:<hobbyID>1</hobbyID><hName>爬山</hName><hobbyID>2</hobbyID><hName>游泳</hName><hobbyID>3</hobbyID><hName>美食</hName>
也可以取出自己想要的标签并且拼装sql123SELECT '[ '+hName+' ]' FROM @hobby FOR XML PATH('')运行结果如下所示:[爬山][游泳][美食]
替换函数(stuff(sql,startIndex,length,param))
将sql从startIndex开始删除length长度,然后用param替代删掉的字符。注意startIndex从1开始(数据库一般是从1开始的)123select stuff(',[爬山],[游泳],[美食]',1,1,'')运行结果如下: [爬山],[游泳],[美食]
给指定用户新增所有权限 (列转行,再加上替换函数stuff即可)
|
|
查询慢sql,并且杀死慢sql
|
|
索引相关
|
|
所有公司跑一个sql
|
|
所有公司 但是排除一部分公司 执行sql
|
|
游标
如果需要循环处理sql,并且数据量不是很大的时候,可以使用游标。
|
|