问一个很实际的问题。
我先从数据库里面读出几条记录,eg:从数据库里面读出2009年1月份的数据。
mc day data
M1 2009-01-02 13
M1 2009-01-05 20
M2 2009-01-11 12
M4 2009-01-30 21
M5 2009-01-05 15
然后要在jsp页面中按照mc显示出这个月的每天的数据,并汇总。
要求如果是当前月的话显示到今天,如果月份比当前的月大的话,就没有数据显示。
AVG为sum by mc
Total为这一天所有mc的总和
mc要按照顺序排序。M1,M2,M3.......
2009-01-01 2009-01-02 2009-01-03 2009-01-04 2009-01-05 2009-01-06 .......AVG
M1 13 20 1.06
M2
M4
M5 15
Total 13 35
不知道数据怎么存放好,要求效率要高。
谢谢,要有实现代码
[b]问题补充:[/b]
页面显示有点问题。
是这样的。我从数据里面读到的数据为:
mc day data
M1 2009-01-02 13
M1 2009-01-05 20
M2 2009-01-11 12
M4 2009-01-30 21
M5 2009-01-05 15
然后我要把它在页面中显示出来。
表头:是这个月的所有的天数(2009-01-01,2009-01-02,...2009-01-31),最后放一个avg。
列为mc的列表+total信息。
就是显示每台mc在这个月的每天的data。
01-01 01-02 01-03 01-04 01-05 01-06 ....... 01-31 AVG
M1 13 0 0 0 20 0 0 1.06--(13+20)/31
M2 0 0 0 0 0 0 0 0.39
M4 0 0 0 0 0 0 0 0.68
M5 0 0 0 0 15 0 0 0.48
Total 13 0 0 0 35 0 0 2.61
[b]问题补充:[/b]
谢谢zgy_zhengGY ,你的答复。
[code="java"]
有一个对应的实体对象 封装所有字段 外加上字段 avg的,
[/code]
不知道你这个实体是怎么组织的?
要放到什么集合中?怎么放?
[b]问题补充:[/b]
[code="java"]
class Tab{
private String mc;
private String day;
private int data;
private double avg;
//getter and setter method
[/code]
然后:
[code="java"]
List tabList = new ArrayList();
Tab tab1 = new Tab();
tab1.setMc("M1");
tab1.setDay("2009-01-02");
tab1.setData(13);
tab1.setAvg(0.0);//不知道这个放什么值,暂时先放个0.0
tabList.add(tab1);
tab1 = new Tab();
tab1.setMc("M1");
tab1.setDay("2009-01-05");
tab1.setData(20);
tab1.setAvg(0.0);
tabList.add(tab1);
tab1 = new Tab();
tab1.setMc("M2");
tab1.setDay("2009-01-11");
tab1.setData(12);
tab1.setAvg(0.0);
tabList.add(tab1);
tab1 = new Tab();
tab1.setMc("M4");
tab1.setDay("2009-01-30");
tab1.setData(21);
tab1.setAvg(0.0);
tabList.add(tab1);
tab1 = new Tab();
tab1.setMc("M5");
tab1.setDay("2009-01-05");
tab1.setData(15);
tab1.setAvg(0.0);
tabList.add(tab1);
[/code]
然后在页面中怎么显示呢?
01-01 01-02 01-03 01-04 01-05 01-06 ....... 01-31 AVG
M1 13 0
M1 20 0
M2 12 0
M4 21 0
M5 15 0
这样不行吧
[b]问题补充:[/b]
真是太感谢了。我看明白了。
但是有几个地方你没注意:
1,我从数据库里面读出来的天数,并不一定每天都有,比如说只有1号的数据,但是也要在页面中显示出31天的数据。
2,我从数据库里面读出来的可以一个mc有几条记录。但是要显示在一行。
你写的标签中少了点东西:
[code="jsp"]
${tab.mc} | ${tab.data} | ${tab.avg} |
[b]问题补充:[/b]
可是离我要的结果还有很远。
还有很多的地方要处理,你说的那个最平常的做法。这里要做数据的处理,你没有说怎么处理的。而这中是我要问的。
[b]问题补充:[/b]
谢谢。对,是写死的,还要考虑到月份的问题。
我写过,用到2层hashmap,用了很多的代码,感觉效率不是很高。
请教有什么好的方法吗?
[b]问题补充:[/b]
好,你只解决了一个问题,还有一个:
2,我从数据库里面读出来的可以一个mc有几条记录。但是要显示在一行。
还有就是avg和total怎么来处理呢
[b]问题补充:[/b]
可以用数据库来处理,但是现在的问题,你不是dba,只能去读数据库,而且数据量很大,不能给数据库带来负担。
只能用code来处理
这个问题规定只能用JAVA来做吗?
我觉得这个问题用存储过程的话会更快,代码也比较清晰。
所有的逻辑方存储过程里,java掉用一下存储过程就可以了。
下面的SQL语句写的不完全,大概表达一下我的意思。
可以在存储过程里对根据不同的月份加工一下。
SELECT mc,
sum(case to_char(day,'DD') when '01' then data else 0 end) as day1,
sum(case to_char(day,'DD') when '02' then data else 0 end) as day2,
sum(case to_char(day,'DD') when '03' then data else 0 end) as day03,
sum(case to_char(day,'DD') when '04' then data else 0 end) as day04,
sum(case to_char(day,'DD') when '05' then data else 0 end) as day05,
sum(case to_char(day,'DD') when '06' then data else 0 end) as day06,
sum(case to_char(day,'DD') when '07' then data else 0 end) as day07,
sum(case to_char(day,'DD') when '08' then data else 0 end) as day08,
sum(case to_char(day,'DD') when '09' then data else 0 end) as day09,
sum(case to_char(day,'DD') when '10' then data else 0 end) as day10,
AVG(data)
FROM XIAOYAO
GROUP BY mc
运行结果:
M1 0 13 0 0 20 0 0 0 0 0 16.5
M2 0 0 0 0 0 0 0 0 0 0 12
M4 0 0 0 0 0 0 0 0 0 0 21
M5 0 0 0 0 21 0 0 0 0 0 21