SQL小技巧
1、行列互转
(1)
--创建一个表
create table tb1
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)
--插入两条数据
insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)
--行转成列
select * from tb1
select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end
上面SQL执行完成的结果如下图:
2、换行
使用char(10)+char(13)即可换行并空行
使用char(10)、char(13)其中一个即可换行
3、根据条件显示不同内容
使用case when 条件 then 结果 else end 、CASE 字段 WHEN 字段的值 THEN 结果 END 两种格式可以实现根据条件显示不同内容。
例如:
(1)
CASE when sta.cStateCode = sta_off.cStateCode then
case when sta.cStateName = '正常' then cast(attD.fWorkDays as nvarchar(100))
else sta.cStateName
end
else cast(attD.fWorkDays as nvarchar(100))+'天'
end
解释:上面一段的意思就是
if(sta.cStateCode == sta_off.cStateCode){
if(sta.cStateName == '正常'){
return cast(attD.fWorkDays as nvarchar(100));
}else{
return sta.cStateName;
}
} else{
return cast(attD.fWorkDays as nvarchar(100))+'天';
}
return的值就是最终这一列要显示的值
(2)
SUM(CASE c.cDefine2 WHEN 0 THEN b.fWorkDays END) as changbai
解释:
double changbai;
for(int i=0;i<list.length;i++)
{
if(c.cDefine2==0){
changbai=changbai+b.fWorkDays;
}
}
最终得到的changbai变量就是要显示的值
4、两行并一行
select dDocDate,cDefine1,bodya
=(stuff((select ','+cClassName+':'+cast(fWorkDays as nvarchar(100))
--case when count(cDefine1)>1 then ','+cClassName end
from #AttYearTempTable where dDocDate=att.dDocDate and cDefine1=att.cDefine1 and cPsn_Num=att.cPsn_Num for xml path('')),1,1,'')
(1)stuff方法:SELECT STUFF('abcdef', 2, 3, 'ijklmn')——意思是:
从第一个字符串 abcdef 的第 2 个位置 (b) 开始删除三个字符,然后在删除位置插入第二个字符串,从而创建并返回一个字符串。
STUFF ( character_expression , start , length , replaceWith_expression )
(2)SELECT * FROM @hobby FOR XML PATH('MyHobby')——意思是:将获取的数据转成XML格式,并且取MyHobby为行节点名,字段名为叶子节点名
select * from Table for xml path('')——意思是:将获取的数据转成XML格式,并且取row为行节点名,字段名为叶子节点名
SELECT hobbyID as 'MyCode',hName as 'MyName' FROM @hobby FOR XML PATH('MyHobby')——意思:改变列节点名