关闭

SQL点滴之几个有点偏的语句

发表于:2011-8-05 09:58

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

  SQL语句是一种集合操作,就是批量操作,它的速度要比其他的语言快,所以在设计的时候很多的逻辑都会放在sql语句或者存储过程中来实现,这个是一种设计思想。但是今天我们来讨论另外一个话题。Sql页提供了丰富的函数供我们使用,还有很多操作有意想不到的结果,今天这个随笔来看看一些不常见到的sql语句。这些语句不像普通的增删查那样平白,它的奇妙之处有时候让人另眼相看。

  1、假设我想把Person.Contact表中所有人的名字用逗号连接起来,串成一个字符串,可能会想到使用游标把FirstName查出来然后逐行赋值给一个字符串变量,可是使用游标的代价是很大的。看看下面的代码:

  1. declare @names varchar(1000)=''—注意赋值为空字符串是必须的 
  2. select @names=isnull(@names,'')+FirstName+',' from Person.Contact 
  3. print @names

  查询得到的结果是(用的是AdventureWorks数据库中的Contact表):

  Gustavo,Catherine,Kim,Humberto,Pilar,Frances,Margaret,Carla,Jay,Ronald,Samuel,James,
  Robert,Fran? ois,Kim,Lili,Amy,Anna,Milton,Paul,Gregory,J.Phillip,
  Michelle,Sean,Phyllis,Marvin,Michael,Cecil,Oscar,Sandra,Selena,Emilio,
  Maxwell,Mae,Ramona,Sabria,Hannah,Kyley,Tom,Thomas,John,Chris,

  使用其他的语句是不能达到这个效果的,不过我没有深入考虑过,但是这个是很简单的语句。

  还有一个地方和这个类似,就是在行列转换的时候拼接动态sql语句,首先使用下面的语句创建一个临时表:

  1. create table #DepartCost 
  2. id int
  3. Department varchar(20), 
  4. Material varchar(20), 
  5. Number int 
  6. insert into #DepartCost values 
  7. (1,'厂房','材料',1), 
  8. (1,'厂房','材料',2), 
  9. (1,'厂房','材料',1), 
  10. (1,'厂房','材料',1), 
  11. (1,'厂房','材料',1), 
  12. (1,'厂房','材料',1), 
  13. (1,'厂房','材料',2), 
  14. (1,'厂房','材料',1), 
  15. (1,'厂房','材料',1)

  表中的数据如下:

图1

  我们看到每个厂房分别使用的材料数量,还是一个老问题,如果我们想知道针对每种材料,每个厂房耗费的材料数量是多少该怎么写呢。有一种笨的方法,如下:

  1. select Department, 
  2. sum(case Material when '材料1' then Number else 0 endas [材料], 
  3. sum(case Material when '材料2' then Number else 0 endas [材料], 
  4. sum(case Material when '材料3' then Number else 0 endas [材料] 
  5. from #DepartCost 
  6. group by Department

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号