求数据库中生成交叉报表的算法(不知道放在这里是否合适)

来源:百度知道 编辑:UC知道 时间:2024/05/15 15:38:20
我怕自己说不清楚,举个例子来说下:
数据库中有个表,内容如下:
月份 蔬菜 销售量
1月 白菜 50斤
1月 土豆 30斤
2月 白菜 60斤
2月 土豆 40斤
2月 黄瓜 10斤
3月 白菜 5斤
......
我想要生成一张这样的报表:
1月 2月 3月
白菜 50斤 60斤 5斤
土豆 30斤 40斤 0斤
黄瓜 0斤 10斤 0斤

要求:以上只是个象征意义的例子,蔬菜品种和月份都不是固定的,月份不一定只有12个月,数据量在几万条左右,数据库目前用的是oracle,如果其它数据库有好的解决办法也可以,不要用oracle的decode函数,效率不行而且也不能做到非常灵活,要求方案要非常灵活,具有通用性,能加上合计最好了,用sql语句或编程的办法都可以,效率要高,不要告诉我用powerbuilder的crosstab报表,我其实最后想得到的效果就是那样结果,只是不用pb来实现.

请大家帮忙想下好方法,对于确实可行且效率高的想法可加到200分.

如果只是想快速生成交叉表,此类数据,手工或程序导入到EXCEL中或Access中,用“数据透视表”,太简单了。
如果是要在程序代码中实现,建议:
利用形如以下的简单SQL语句(效率应该很高):
SELECT Sales.蔬菜, First(Sales.月份) AS 月份OfFirst, Sum(Sales.销售量) AS 销售量OfSum
FROM Sales
GROUP BY Sales.蔬菜
HAVING (((First(Sales.月份))="1月"));

生成每个月的sum数据,形如:

蔬菜 月份OfFirst 销售量OfSum
白菜 1月 115
土豆 1月 70
针对每个月循环生成,将这些汇总数据(量很小吧)填写在对应的交叉点即可。

使用2重循环,外层是蔬菜类的循环,内层是月份循环,嘴里面用一条语句得到这种蔬菜这个月的量;

if object_id('pubs..tb') is not null
drop table tb
go
create table tb
(
月份 varchar(10),
蔬菜 varchar(10),
销售量 varchar(10)
)

insert into tb(月份,蔬菜,销售量) values('1月','白菜','50斤')
insert into tb(月份,蔬菜,销售量) values('1月','土豆','30斤')
insert into tb(月份,蔬菜,销售量) values('2月','白菜','60斤')
insert into tb(月份,蔬菜,销售量) values('2月','土豆','40斤')
insert into tb(月