数据库中的表生成table的问题

rubbylee 2008-07-16 09:52:46
现有一数据库中的表,共3项,类型、地点、统计量,如下:
a 北京 1
b 北京 1
d 北京 1
e 北京 1
a 广西 2
c 广西 2
d 广西 2
e 河北 38
f 河北 1
a 湖南 28
d 湖南 13
e 江苏 4
e 辽宁 3
f 辽宁 5
现已通过如下代码加载了数据表信息
//装载驱动程序
Class.forName(dbdriver).newInstance();
//创建连接
Connection con=java.sql.DriverManager.getConnection(dburl,dbname,dbpsw);
Statement stmt=con.createStatement();

ResultSet rst=stmt.executeQuery(sql);
ResultSetMetaData meta=rst.getMetaData();
请教如何将在jsp的table中按如下形式显示
北京 广西 河北 湖南 江苏 辽宁
a 1 2 0 28 0 0
b 1 0 0 0 0 0
c 0 2 0 0 0 0
d 1 2 0 13 0 0
e 1 0 38 0 4 3
f 0 0 1 0 0 5
...全文
221 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianyidan 2008-07-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bao110908 的回复:]
我对 SQL 不熟,只能想到下面的笨办法:

表 tom 的结构:
Java code+---------+------------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+---------+------------------+------+-----+---------+----------------+|id|int(10) unsigned|NO|PRI|NULL|auto_increment||type|varchar(5)|NO|||||address|varchar(10)|NO|||||count|int(10) unsigned|NO||||+---------+-----------------…
[/Quote]
chen00zhou 2008-07-17
  • 打赏
  • 举报
回复
关注,上次也想写个类型的功能,没想到啥简单方法放弃了,希望有高人指点
  • 打赏
  • 举报
回复
我对 SQL 不熟,只能想到下面的笨办法:

表 tom 的结构:
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| type | varchar(5) | NO | | | |
| address | varchar(10) | NO | | | |
| count | int(10) unsigned | NO | | | |
+---------+------------------+------+-----+---------+----------------+


先找出所有的地址:
SELECT t.address FROM tom t GROUP BY t.address;


再根据地址动态地拼合 SQL 语句:
SELECT t.type AS 类型,
SUM(CASE WHEN t.address='北京' THEN t.count ELSE 0 END) AS 北京,
SUM(CASE WHEN t.address='广西' THEN t.count ELSE 0 END) AS 广西,
SUM(CASE WHEN t.address='河北' THEN t.count ELSE 0 END) AS 河北,
SUM(CASE WHEN t.address='湖南' THEN t.count ELSE 0 END) AS 湖南,
SUM(CASE WHEN t.address='江苏' THEN t.count ELSE 0 END) AS 江苏,
SUM(CASE WHEN t.address='辽宁' THEN t.count ELSE 0 END) AS 辽宁
FROM tom t
GROUP BY t.type;


生成结果:
+------+------+------+------+------+------+------+
| 类型 | 北京 | 广西 | 河北 | 湖南 | 江苏 | 辽宁 |
+------+------+------+------+------+------+------+
| a | 1 | 2 | 0 | 28 | 0 | 0 |
| b | 1 | 0 | 0 | 0 | 0 | 0 |
| c | 0 | 2 | 0 | 0 | 0 | 0 |
| d | 1 | 2 | 0 | 13 | 0 | 0 |
| e | 1 | 0 | 38 | 0 | 4 | 3 |
| f | 0 | 0 | 1 | 0 | 0 | 5 |
+------+------+------+------+------+------+------+


这个是在 MySQL 上做的,在 MS SQLServer 上应该也可以的。
dvictor 2008-07-17
  • 打赏
  • 举报
回复
可以用两个hashmap来表示
map1{key=城市,obj=map2} map2{key=类型,obj=统计量}

然后用循环语句再jsp页面上生成table里的数据
夏至夕陽 2008-07-17
  • 打赏
  • 举报
回复
把現在的這個結果以類型和地點為key,構造一個map
並且把類型和地點都放到數組裏。

橫向遍曆地點集合,縱向遍曆類型。

裏面的值根據當前位置,比如(1,1)是(a, 北京)去map裏找到值,顯示出來。


[Quote=引用 10 楼 rubbylee 的回复:]
现在已经是通过合成两个表输出后的结果了,而且不知道纵坐标的表头为类型,每种类型占一行,横坐标的表头为地点,每个地点占一行
引用 6 楼 seeSkyblue 的回复:
select 类型,地点,sum(统计量) from 表 group by 类型,地点

a 北京 1
a 广西 2
a 河北 0
a 湖南 28
a 江苏 0
a 辽宁 0
b 北京 1
b 广西 0
b 河北 0
b 湖南 0
b 江苏 0
b 辽宁 0
…………

就相当于把你这张表竖起来,然后你就根据这…
[/Quote]
  • 打赏
  • 举报
回复
soncode


具体去sqlserver板块问吧 懒得拼语句了
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
是38,只是我打下面那个表时没太注意格式,你仔细看一下,38是第三列的,只是错开了,不好意思哈,丢人了
[Quote=引用 9 楼 omett 的回复:]
問一下,樓主,e 河北 明明是38,在你要求的結果裏為什麼是0?
[/Quote]
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
我现在的想法也是用list但不会写,可否附上代码,让小弟学习一下
[Quote=引用 8 楼 zhangshenqiu 的回复:]
1.先查unique地点,返回一个list,再遍历 <td>。
2.再根据地点和类型查,地点要是list里面的。
试试吧。
[/Quote]
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
现在已经是通过合成两个表输出后的结果了,而且不知道纵坐标的表头为类型,每种类型占一行,横坐标的表头为地点,每个地点占一行
[Quote=引用 6 楼 seeSkyblue 的回复:]
select 类型,地点,sum(统计量) from 表 group by 类型,地点

a 北京 1
a 广西 2
a 河北 0
a 湖南 28
a 江苏 0
a 辽宁 0
b 北京 1
b 广西 0
b 河北 0
b 湖南 0
b 江苏 0
b 辽宁 0
…………

就相当于把你这张表竖起来,然后你就根据这个在页面上显示出来就行了。
显示的逻辑自己想一想。
[/Quote]
夏至夕陽 2008-07-17
  • 打赏
  • 举报
回复
問一下,樓主,e 河北 明明是38,在你要求的結果裏為什麼是0?
zhangshenqiu 2008-07-17
  • 打赏
  • 举报
回复
1.先查unique地点,返回一个list,再遍历<td>。
2.再根据地点和类型查,地点要是list里面的。
试试吧。
wufeng135 2008-07-17
  • 打赏
  • 举报
回复
帮顶一个
seeSkyblue 2008-07-17
  • 打赏
  • 举报
回复
select 类型,地点,sum(统计量) from 表 group by 类型,地点

a 北京 1
a 广西 2
a 河北 0
a 湖南 28
a 江苏 0
a 辽宁 0
b 北京 1
b 广西 0
b 河北 0
b 湖南 0
b 江苏 0
b 辽宁 0
…………

就相当于把你这张表竖起来,然后你就根据这个在页面上显示出来就行了。
显示的逻辑自己想一想。
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
之前的sql变量是我的sql语句,已经将两个表合成一个表进行输出了,现在所得到的表是合成后的
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
ms sqlserver
seeSkyblue 2008-07-17
  • 打赏
  • 举报
回复
你的数据库类型是什么?
oracle? mysql? sql server?
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
加分求助
a_bin_98 2008-07-17
  • 打赏
  • 举报
回复
交叉表。。列转行
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
刚把问题解决了,附上源码,别人帮忙弄的(其中getCol是转换编码的)
HashMap<String,HashMap<String,String>> locationMap = new HashMap<String,HashMap<String,String>>();
List<String> locationList = new LinkedList<String>();
List<String> categoryList = new LinkedList<String>();
//装载驱动程序
Class.forName(dbdriver).newInstance();
//创建连接
Connection con=java.sql.DriverManager.getConnection(dburl,dbname,dbpsw);
Statement stmt=con.createStatement();

ResultSet rst=stmt.executeQuery(sql);
ResultSetMetaData meta=rst.getMetaData();
while(rst.next())
{
String location = getCol(rst,meta.getColumnType(2),2);
String category = getCol(rst,meta.getColumnType(1),1);
String sum = getCol(rst,meta.getColumnType(3),3);

Set<String> keySet = locationMap.keySet();
if (keySet.contains(location)) {
HashMap<String,String> tmpCatMap = locationMap.get(location);
Set<String> tmpKeySet = tmpCatMap.keySet();
if (!tmpKeySet.contains(category)) {
tmpCatMap.put(category,sum);
}
}
else {
HashMap<String,String> categoryMap = new HashMap<String,String>();
categoryMap.put(category,sum);
locationMap.put(location,categoryMap);
}
if (!locationList.contains(location)) {
locationList.add(location);
}
if (!categoryList.contains(category)) {
categoryList.add(category);
}

}
out.println("<tr>");
out.println("<td>");
out.println("</td>");
Iterator<String> iterator = locationList.iterator();
while(iterator.hasNext()) {
out.println("<td>");
out.println(iterator.next());
out.println("</td>");
}
out.println("</tr>");

for (String tmpCatetory : categoryList) {
out.println("<tr>");
out.println("<td>");
out.println(tmpCatetory);
out.println("</td>");

for (String tmpLoc : locationList) {
out.println("<td>");
String tmpSum = locationMap.get(tmpLoc).get(tmpCatetory);
if (tmpSum == null)
out.println(0);
else
out.println(tmpSum);
out.println("</td>");
}

out.println("</tr>");
}

ExcelUtil excelUtil = new ExcelUtil("");

//关闭连接,释放资源
rst.close();
stmt.close();
con.close();
rubbylee 2008-07-17
  • 打赏
  • 举报
回复
你这样就写死了,开始时你不知道有多少地方节点,也不知道有哪些地方节点,所以不能这么写
[Quote=引用 25 楼 yirentianran 的回复:]
你直接从数据库中取出结果集
在页面显示的时候做一下判断就行了

伪码 你改下


HTML code
<table>
<tr><td> </td><td>北京</td><td>广西</td><td>河北</td><td>湖南</td><td>江苏</td><td>辽宁</td></tr>
<!--循环-->
<tr><td>类型</td><td>if(地点==北京){统计量}else{ }</td>
<td>if(地点==广西){统计量}else{ }</</td>
...
</tr>
<!--循环结束-->
</table>
[/Quote]
加载更多回复(7)

81,114

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧