to 通济桥
首先要清楚你的报表类型是什么。
它外面是一个交叉表,按照工厂和除库日期进行的交叉表。它并不是
很难。里面是一个简单的表。
但是将它们放到一起,那就是一个问题了!因为一般的交叉表都是细
目为数值型的(比如这里的数量),可这里却将合同号开了进去,实在
是变了样。
明白了问题所在,就可以想办法解决。
解决方案的核心是将这个交叉表转化为一般的表,它的结构可以如下
合同号 出库期 A工厂出库量 B工厂出库量 C工厂出库量 ... 数量
(有多少工厂就有多少个xxx出库量字段)
如何办到了?
解决方案之一:(不推荐,仅作参考)
简单的方法是使用多个联合Union语句(数量和xxx出库量字段的个数一样)
SQL如下:
SELECT 合同号, 出庫期, 数量 AS A工厂出库量,0 AS B工厂出库量,0 AS C工厂出库量,数量
FROM [order]
WHERE ((工厂='A'))
union
SELECT 合同号, 出庫期,0,数量,0, 数量
FROM [order]
WHERE ((工厂='B'))
union
SELECT 合同号, 出庫期,0,0,数量, 数量
FROM [order]
WHERE ((工厂='c'));
但是并没有将它们合并,再分组汇总一下即可.SQL语句如下:
select 出庫期,合同号,sum(A工厂出库量),sum(B工厂出库量),sum(C工厂
出库量),sum(数量)
from [ByFactory]
group by 出庫期,合同号;
byFactory是前一步生成的查询名。
完成了这一步,下面的报表也就不难了。我就不说了。
这是使用多步做成的。
这种方法的问题在于
1.使用了Union,它的速度令人担忧,如果你的数据量不大的话,没有什么
问题。如果过多的话,请使用存储过程实现这些SQL而不是使用这种复杂的
嵌套的SQL。性能是没有问题的。
2.多步查询,在Access还可以,其它的我没有做过,(因为我是采用的是
存储过程实现,所以不是问题)
解决方案之二:(推荐)
幸好在Access现在(我指的是AccessXP)提供了新的SQL语句(我不很确定)
可以使用一个简单的SQL语句完成上面的工作。如下:
TRANSFORM Sum(order.数量) AS 数量之Sum
SELECT order.出庫期, order.合同号
FROM [order]
GROUP BY order.出庫期, order.合同号
PIVOT order.工厂;
这是一个交叉表,可以形成相同的数据集,很简单,性能可以满足,但是
可能Pivot语句是TSQL的新增语法吧!(在Access XP或者SQL Server2000中
应当是有的,但是在Access97可能就没有,我不是很确定)。
题外话。
另外说一句,这种问题在做中国式报表的时候常常会碰到,它和西方的开
发工具总是不那么协调,不可能有什么直接的解决方案。我在实际的开发
中总结的最好的解决方案是劝说客户转变管理思维。(按道理应当是这样
,可是实际上。。。)
这两种方式我都用你的数据试过.没问题。
to zhj09
和你的思路一样