如何制作有1-31号日期为列的报表,横排变成竖排,我的程序总是超时! (200分)

B

b2sun

Unregistered / Unconfirmed
GUEST, unregistred user!
但我有一个其它的问题请教!

有这样一个表:

DATA ID NAME PRICE REMARK NUMBER
2001-1-1 123 罗卜 56.00 青菜类 122
2001-3-3 124 土豆 12.00 青菜类 111
2001-3-11 219 豆腐 58.00 豆制品 9
2001-3-11 121 。。 。。 。。
2001-3-11 124 .。 。。。。。。。

这样的表,我想生成一个关于这样的报表:

NAME 1号 2号 3号 4号 5 号。。。。。。31号
罗卜 5 12 89 1 22 12
土豆 11 8 1 1 12 33
.。。。。。。。。。。。。。。。。。
这样的报表如何制作呀
数据量还不小呢?

我用的 C++BUILDER 和 DELPHI!

实现起来太难了,,,不是要建立一个临时的
报表吧? 把每天做为一个字段吗???
如果用LEFT JOIN的方法超过4号我这里亦超时,不论是在SQL SERVER2000中还是在程序中
我的ADOconnection 的timeout 设置了8000秒呀,但我在执行时不到30秒就 报超时了!
怎么回来呢?各位英雄多我指教!

英雄请多多指教!
急用

我的邮件:along@b2sun.com
电话 : 13802785865




ALONG
2003-5-11
 
这个问题以前讨论过
即竖表变横表
贴子记不得
贴一段看一下思路主要还是建立临时表
有一表,结构如下:
zd1 zd2 zd3 zd4(整型)
a1 b1 c1 2
a1 b1 c2 3
a1 b2 c1 4
a1 b2 c3 5
a2 b5 c2 3
a2 b2 c3 4
如何将它转变成如下表格:
() () c1 c2 c3 c4 c5 合计
a1 b1 2 3 5
a1 b2 4 5 9
a2 b5 3 3
a2 b2 4 4
就是说,把本来是竖排着的值转成横着的值,
像上面的结果,把 zd1、zd2 相同的记录,根据其 zd3 的不同,把zd3 横着排列,
请问用 SQL 语句如何实现?
先谢过!
select zd1,zd2,(sum (case zd3 when c1 then
zd4 else
0 end))as c1,
(sum case zd3 when c2 then
zd4 else
0 end))as c2,
(sum( case zd3 when c3 then
zd4 else
0 end))as c3,
(sum( case zd3 when c4 then
zd4 else
0 end))as c4,
(sum( case zd3 when c5 then
zd4 else
0 end))as c5,(c1+c2+c3+c4+c5) as totalnum
from tanblename
ord by zd1,zd2
group by zd1,zd2,totalnum
select zd1,zd2,
c1=(select sum(zd4) from table1 a where a.zd1=table1.zd1 and a.zd2=table1.zd2 and a.zd3='c1'),
c2=(select sum(zd4) from table1 a where a.zd1=table1.zd1 and a.zd2=table1.zd2 and a.zd3='c2'),
c3=(select sum(zd4) from table1 a where a.zd1=table1.zd1 and a.zd2=table1.zd2 and a.zd3='c3'),
c4=(select sum(zd4) from table1 a where a.zd1=table1.zd1 and a.zd2=table1.zd2 and a.zd3='c4'),
c5=(select sum(zd4) from table1 a where a.zd1=table1.zd1 and a.zd2=table1.zd2 and a.zd3='c5'),
合計=sum(zd4)
from table1 group by zd1,zd2 order by zd1,zd2
 
我就 是想把这个日期 的东西搞过来,说白了,亦是横竖倒过来,,大哥有没有办法搞定,
如果直接建立这样的有1-31号做为字段的表也太。。。。。!!!
 
提问的人可能没搞过数据库,人家这个答案并非给你“直接建立这样的有1-31号做为字段的表”,
而是给你做了一个查询,如果连这样的一个SQL你看起来都会有问题的话,如果别人给你一个数据仓库的解决方案你就更看不懂了。
ORACLE,SQL SERVER的SQL都提供了这样的写法。程序是一行一行写出来的,不是通过意念来完成的
 
那我要写31行还不只呀!!!
可是我的一个朋友用POWERBUILDER做了一个,说根本就不用这样,它说PB里面直接拖放亦可以了!!
我看了效果,查询10万条记录只要1-3钞钟吧,,而我做的要用 190多秒还未完成。。。 大侠多多帮助我吧,!!!!我有它的程序但没有PB的原程序!!! 拜托了!
 
大哥,我看不明白!
 
date salesID Name price number remark
2002-1-1 121 a1 12 30
2002-1-1 122 a1 12 130
2002-1-1 123 a1 12 30
2002-1-1 124 b1 241 120
2002-1-1 125 b1 12 30
2002-1-1 126 c1 122 34
2002-1-11 121 a1 12 30
2002-1-21 122 a1 12 130
2002-1-22 123 a1 12 30
2002-1-24 124 b1 241 120
2002-1-24 125 b1 12 30
2002-1-26 126 c1 122 34

这样的表。。
我把它搞成按NAME来编的查询表
name 1号 2 号 3 号 4 号 5号。。。。。。。。。。。。。。31号
a1 12个 25个 9个 。。。。 8个
b1 24个 。。。 5个 。。。。
c1 134个 。。。。。。。 3个 5 个 8 个。。。。。。。129个
d1 11个。。12 个
这个能用这个办法来实现吗、大侠!我指教!!!!
 
当然是要通过每一个日期是一个字段了!
select Name,
sum(select number/price as 一号 from tablename where day(date) = 1),
sum(select number/price as 二号 from tablename where day(date) = 2),
..........................
..........................
..........................
..........................
from tablename
group by name
 
也没有什么难的嘛,按日期分组,交叉表!
 
我把数库放在下面的连接
我把所有的东西放在http://www.b2sun.com/db.rar
表名为: tmbill_det(定单明细表) tmbill_gen(定单总表)
数据库名称为: b2sun_dining
SQL SERVER 2000
大侠帮助我搞定它好吗?我急用呢?
(200*)年**月菜类销售每日对照分析表(九)
起始日期:******* 终止日期:*******
菜名 规格 1 2 3 ..... 31 合计
罗卜 盘 30 129 88 ...... 12 2459
面条 碗 98 129 128 ...... 32 12459

合计:
统计日期: 统计人:
要求: 1. 按菜编号排序(升序,降序)
2.并不是所有的菜都这样打出来,能不能在商品表里设置一个标识
让统计人在统计时临时设置
3.打印每一天的销售数
有关细节我已经放在那个连接中不,请大侠相助!我的邮件:along@b2sun.com
手机:13802785865多谢!24小时待机等!
 
请记得---》数据库的还原方法,
1,建立一个名称为b2sun_dining的数据库
2,在b2sun_dining数据库中点右键 出现 所有任务--》还原数据库 --》选设备
---》找到我给出的数库文件,我试过不,没有问题的,可以还原成功!
3,, 有两个文件,其中的有关1-31号这样的表的东西,我实在是理解不到怎么搞法
我有DELPHI,请大侠多指教!
注:
产品名称:tgoodlist
账单主表 : tmbill_gen
明细表 : tmbill_det
????
 
To: Carson_zzd
我用您的方法好像是不行呀!
不能对包含 子查询或者聚合的 表达式执行聚合函数!
显然通不过,,
大侠多指教!
 
大侠,多多关照!急用真的!


ALONG
 
我做过一个竖表变横表的函数。
1。不改变原始数据库,把转过的数据存放在本地的一个 ClinetDataSet 里,
然后把这个 ClientDataSet 显示出来就可以了。
2.需要有一列(第一列)作为旋转后的字段名,所以第一个字段最好是不要重复且
不包含特殊字符可以用作字段名。
 
建一个专用的统计表
把统计的sql改写为存储过程,调用存储过程写统计表
避免每次都执行统计sql
 
sTable.db
库位 货物编号 库存数
1 0101 50
1 0102 60
1 0103 50
2 0101 90
2 0103 100
2 0111 30
3 0101 120
3 0102 110
4 0101 11

只列出表中库位为1、2、3的数据,格式如下:
货物编号 库位1 库位2 库位3
0101 50 90 120
0102 60 110
0103 50 100
0111 30
请问用一句sql语句怎么实现?
select a.货物编号,sum(b.库存数),sum(c.库存数),sum(d.库存数)
from stable a
left join (select 货物编号, 库存数 from stable where 库位=1)b on a.货物编号=b货物编号
left join (select 货物编号, 库存数 from stable where 库位=2)c on a.货物编号=c。货物编号
left join (select 货物编号, 库存数 from stable where 库位=3)c on a.货物编号=d。货物编号
group by a.货物编号
参考 参考吧
 
能不能说明一下怎么个搞法,或者是用SQL直接搞定呢?
大侠多指教
我的邮件 :along@b2sun.com如果能搞定我愿出我所有的分给你如何?
我还有1400分
 
select a.货物编号,sum(b.库存数) as 1 号,sum(c.库存数) as 2号,sum(d.库存数) as 3号...
from stable a
left join (select 货物编号, 库存数 from stable where date(日期)=1.)b on a.货物编号=b货物编号
left join (select 货物编号, 库存数 from stable where date(日期)=2)c on a.货物编号=c。货物编号
left join (select 货物编号, 库存数 from stable where date(日期)=3)c on a.货物编号=d。货物编号


group by a.货物编号
说明:货物编号=你的菜的编号
 
我先试试,如果成功, 我给分!我说话算话,如果你在广州,我还可以去拜访一下大侠!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
728
import
I
I
回复
0
查看
706
import
I
顶部