黑马程序员技术交流社区

标题: sql语句急! [打印本页]

作者: duanhuilin    时间: 2012-10-26 10:47
标题: sql语句急!
请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。

table1

月份mon 部门dep 业绩yj
-------------------------------
一月份      01      10
一月份      02      10
一月份      03      5
二月份      02      8
二月份      04      9
三月份      03      8

table2

部门dep      部门名称dname
--------------------------------
       01      国内业务一部
       02      国内业务二部
       03      国内业务三部
       04      国际业务部

table3 (result)

部门dep 一月份      二月份      三月份
--------------------------------------
       01      10        null      null
       02      10         8        null
       03      null       5        8
       04      null      null      9

各位高手帮忙想个办法,怎么解决?版主也帮想想。。。谢谢!!!
作者: dqzg12300    时间: 2012-10-26 16:58
设置主表的部门dep 列为主键,其他表的部门dep 列为外键。然后使用的时候就是
select * from table1 inner join table3 on table1.部门dep =table3.部门dep  然后后面要是还有条件就加where
作者: 欧玉斌    时间: 2012-10-26 18:47
本帖最后由 幻想领域 于 2012-10-26 18:58 编辑


(怎么帖子编辑一下就老出错)
你的方法只能查到横向的内容,楼主需要的是行转列,本来作为行的月份,变为作为列的月份
这是你的方法得出的效果:

表1(其实只用到表1,表2用不到):

效果图(还有点小问题,月份顺序错了):

这里用到了行转列PIVOT函数
推荐看一下这篇博文:http://hi.baidu.com/wrgcxfcoybinpur/item/90f388e2ec0f853286d9decc
也可以看这篇:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html,百度那篇介绍得更详细,但排版较差
  1. declare @sql varchar(8000)

  2. select @sql = isnull(@sql + '],[' , '') + 月份mon from Table1 group by 月份mon

  3. set @sql = '[' + @sql + ']'

  4. exec ('select * from (select * from Table1) a pivot (max(业绩yj) for 月份mon in (' + @sql + ')) b')

复制代码

作者: 欧玉斌    时间: 2012-10-27 12:13
今天看视频看到SQL子查询的时候,想到可能可以通过子查询实现类似的行列转换效果。
虽然代码多点,不过还是比较容易看懂的,主要注意多用group by分组好就可以了
下面是代码:
  1. select 部门dep,
  2. (
  3. select 业绩yj from Table1 where 月份mon='一月份'
  4. and 部门dep=t1.部门dep
  5. group by 部门dep,业绩yj
  6. ) as 一月份,
  7. (
  8. select 业绩yj from Table1 where 月份mon='二月份'
  9. and 部门dep=t1.部门dep
  10. group by 部门dep,业绩yj
  11. ) as 二月份,
  12. (
  13. select 业绩yj from Table1 where 月份mon='三月份'
  14. and 部门dep=t1.部门dep
  15. group by 部门dep,业绩yj
  16. ) as 三月份
  17. from Table1 as t1
  18. group by 部门dep
复制代码




作者: 郑鹏    时间: 2012-10-27 13:03
哈哥们你中彩了!真够细的这么多人帮你!
对了!前段时间,我自己开发个新闻发布系统,遇到个问题,总觉得没有好办法解决!大家帮忙想一想!
我也有两个表,一个是news表,一个是newstype表,两个表通过typeid建立外键关系,现在我需要进行多表查询,
*将Datalist中的typeid显示成typename,想一想,如果采用带model的哪种三层架构方式该怎么解决这个问题?前台只需一个<%#Eval("TypeName")%>就可以直接从newstype表里调数据,把news表里的typeid显示成typename?


作者: duanhuilin    时间: 2012-10-29 08:48
幻想领域 发表于 2012-10-27 12:13
今天看视频看到SQL子查询的时候,想到可能可以通过子查询实现类似的行列转换效果。
虽然代码多点,不过还是 ...

太棒了!!!谢谢!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2