| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 948 人关注过本帖
标题:SQL查询表竖行变横行
只看楼主 加入收藏
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
看到你问好久了,没有回答是因为你这种要求非常规,把列值作为字段名一般需要重构数据表。既然你在10楼使用了固有的值“a,b,c,d”,因为这些值原本是数据表的记录值,不能固定的,你非要固定下来的话,可用下述sql语句达到你的要求(c是我在access里建立的表,演示只显示a,b两个字段结果):
sql="SELECT bh, (select sz from c as aa where  aa.bh=c.bh and aa.zl='a') AS a, "
sql=sql & "(select sz from c as aa where  aa.bh=c.bh and aa.zl='b') AS b FROM c GROUP BY bh;"
上述语句在access查询里调试通过,运行效果图如下:

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 xzlxzlxzl 于 2015-3-7 11:41 编辑 ]
2015-03-07 11:39
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
其实像这种数据表旋转并分组处理的想一条简单sql语句是无法完成的,一般会使用存储过程,但vb可以通过代码拼接出一条通用的sql语句。代码大致如下(仍然使用我模拟的数据表c):
dim rst1 as new recordset,rst2 as new recordset,sql as string
sql="select zl from c group by zl"
rst1.open sql,conn,3,3
sql="select bh,"
while not rst1.eof
  sql=sql & " (select sz from c as aa where bh=aa.bh and zl='" & rst1.fileds("zl") & "') as " & rst1.fileds("zl") &","
  rst1.movenext
wend
sql=left(sql,len(sql)-1)  '消除最后一个逗号
sql=sql & " from c group by bh"
rst2 sql,conn,3,3  '执行此句后就是你需要的横行变竖行的记录集了。
2015-03-07 13:19
shunlai
Rank: 1
等 级:新手上路
威 望:1
帖 子:228
专家分:0
注 册:2006-2-1
收藏
得分:0 
版主非常感谢!
我试了一下没问题,哈哈!你让我太高兴了,太谢谢了您不愧为版主。长时间折磨我的问题终于在版主的鼎力帮助下解决了。我衷心向你表示感谢,谢谢!
2015-03-07 16:29
shunlai
Rank: 1
等 级:新手上路
威 望:1
帖 子:228
专家分:0
注 册:2006-2-1
收藏
得分:0 
版主我在今天版主的投票中投了你一票,以表示对你的尊敬与谢意!
顺便想再提个问题,如果在原有一个表竖行变横表的基础上。再有一个表,如是BB表:
bh  time
1   2015-3-7
2   2015-3-8
此表的编号bh与竖行变横行表的编号bh对应。让联合查询:
sql="SELECT bh,time,(select sz from c as aa where  aa.bh=c.bh and aa.zl='a') AS a,(select sz from c as aa where  aa.bh=c.bh and aa.zl='b') AS b FROM c,BB where bh.c=bh.BB GROUP BY bh,time"

以上语句修改为什么执行是错的?再烦帮忙请修改一下,谢谢!
2015-03-07 18:56
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
我就不仔细看你sql错误了,反正标准联合查询不是这样的,下述语句能完成你的要求。
SELECT bh, (select sz from c as aa where  aa.bh=c.bh and aa.zl='a') AS a, (select sz from c as aa where  aa.bh=c.bh and aa.zl='b') AS b, (select [time] from bb where bb.bh=c.bh) AS 时间
FROM c
GROUP BY bh;
2015-03-07 21:32
shunlai
Rank: 1
等 级:新手上路
威 望:1
帖 子:228
专家分:0
注 册:2006-2-1
收藏
得分:0 
OK再次向你表示感谢!另外我看了一下你的介绍,你真是一位小姐吗?如果是的话不好意思那就更谢谢你了,你真聪明哈哈!
2015-03-07 22:43
快速回复:SQL查询表竖行变横行
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045998 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved