SQL小技巧:行列互转,换行,根据条件显示不同内容

本文介绍了一些SQL实用技巧,包括行列互转的方法、如何在SQL中实现换行、根据条件显示不同内容的方式以及如何将两行数据合并为一行。这些技巧对于日常SQL操作非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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')——意思:改变列节点名


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值