A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© duanhuilin 中级黑马   /  2012-10-26 10:47  /  2490 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请用一个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

各位高手帮忙想个办法,怎么解决?版主也帮想想。。。谢谢!!!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

6 个回复

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

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

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
今天看视频看到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
复制代码



评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 幻想领域 于 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')

复制代码
回复 使用道具 举报
设置主表的部门dep 列为主键,其他表的部门dep 列为外键。然后使用的时候就是
select * from table1 inner join table3 on table1.部门dep =table3.部门dep  然后后面要是还有条件就加where

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马