注册 登录
编程论坛 VB6论坛

SQL查询表竖行变横行

shunlai 发布于 2015-02-27 09:44, 948 次点击
各位专家高人新年好!我又遇到一个棘手问题,就是在一个竖行表中如何让其查询结果变成横行?谢谢!
假如原表下为:
bh zl sz
1  a  2
1  b  3
1  c  4
1  d  5
2  a  6
2  b  7
2  c  8
2  d  9
查询结果变成:
bh   a  b  c  d
 1   2  3  4  5
 2   6  7  8  9
15 回复
#2
shunlai2015-02-28 09:13
各位高人:
看来此问题真是个棘手问题,诸位帮忙呀谢谢!顺便提醒一下数据库是ACCESS。请帮忙,非常感谢!
#3
风吹过b2015-02-28 15:29
想到的是使用 多个查询 来生成中间结果,然后再然后一个查询来生成最终结果

1、先生成  a 的查询,字段 bh、a
2、生成  b 的查询
3、生成 c 的查询
4、生成 d 的查询

5、对这4个查询进行 多表 查询。

没有 环境,没办法测试。你慢慢想吧。
#4
shunlai2015-02-28 17:33
谢谢版主的指点!我按此思路试试看,不懂再行请教。
再谢了!
#5
shunlai2015-02-28 19:13
版主我试了一下,水平有限请指教。
分别查询:
sqla= "select bh,zl from aaa where zl='" & "a" & "'"
sqlb = "select bh,zl from aaa where zl='" & "b" & "'"
sqlc = "select bh,zl from aaa where zl='" & "c" & "'"
sqld = "select bh,zl from aaa where zl='" & "d" & "'"
多表查询:
sql = "select sqla,sqlb,sqlc,sqld from aaa group by sqla,sqlb,sqlc,sqld "  ‘这个多表查询方法错误!请指教。谢谢
#6
风吹过b2015-03-01 21:36
使用向导去做啊。

大体上是
select sqla.bh,sqla.a,sqlb.b,sqlc.c,sqld.d from sqla where sqlb.bh=sqla.bh and sqlc.bh=sqla.bh and sqld.db=sqla.bh

或者使用 join 关键字进行连接查询。没有环境,无法测试。
#7
shunlai2015-03-02 21:23
非常感谢版主的回复,但我试了一下sqla导入后程序运行错误!可能不认,为“至少一个参数未被指定”。
#8
shunlai2015-03-04 22:04
我的问题至今仍未解决!希望大家帮忙谢谢。
#9
风吹过b2015-03-06 11:25
今天才有空仔细看一下。

我说的方法是在 access 里实现,因为没有环境,所以没办法测试。

在那里面写查询,操作对象 可以是表,也可以是查询 。
如果没有保存过前面三个查询,那么直接使用 第四个查询,铁定报错的。
#10
shunlai2015-03-07 10:06
风吹过b:版主你好!
真是非常感谢你的回复与帮忙,鄙人是非专业爱好者,且年龄大水平很低。只是为解决工作中问题编点小程序而已,哈哈!你提的的方法是在accsee中实现,因为我小程序查询的是在公司局域网上查询某一设备的accsee数据库。所以最好不要到设备上的accsee库中搞个查询……。
我采取的是编好SQL查询语句,然后绑定表格控件方法。但琢磨了好久也未能搞成真是烦死了。能否请您费心从我的想法方向帮帮琢磨解决?我将不胜感谢!诸如:
sqla= "select bh,zl from aaa where zl='" & "a" & "'"
sqlb = "select bh,zl from aaa where zl='" & "b" & "'"
sqlc = "select bh,zl from aaa where zl='" & "c" & "'"
sqld = "select bh,zl from aaa where zl='" & "d" & "'"
sql……
rs_bf=new oledb.oledbdtaadapter(sql,conn)
rs_bf.fill(bf,"aaa")
datagridview1.datasource=bf.tables("aaa")
再次向你表示感谢!
#11
xzlxzlxzl2015-03-07 11:39
看到你问好久了,没有回答是因为你这种要求非常规,把列值作为字段名一般需要重构数据表。既然你在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 编辑 ]
#12
xzlxzlxzl2015-03-07 13:19
其实像这种数据表旋转并分组处理的想一条简单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  '执行此句后就是你需要的横行变竖行的记录集了。
#13
shunlai2015-03-07 16:29
版主非常感谢!
我试了一下没问题,哈哈!你让我太高兴了,太谢谢了您不愧为版主。长时间折磨我的问题终于在版主的鼎力帮助下解决了。我衷心向你表示感谢,谢谢!
#14
shunlai2015-03-07 18:56
版主我在今天版主的投票中投了你一票,以表示对你的尊敬与谢意!
顺便想再提个问题,如果在原有一个表竖行变横表的基础上。再有一个表,如是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"

以上语句修改为什么执行是错的?再烦帮忙请修改一下,谢谢!
#15
xzlxzlxzl2015-03-07 21:32
我就不仔细看你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;
#16
shunlai2015-03-07 22:43
OK再次向你表示感谢!另外我看了一下你的介绍,你真是一位小姐吗?如果是的话不好意思那就更谢谢你了,你真聪明哈哈!
1