【发布时间】:2013-12-31 05:20:05
【问题描述】:
我使用 SQL Anywhere 作为我的数据库,并使用 Crystal Report 进行报告。
我有两个表 SALES DETAIL (POSDETAIL) 和 Inventory Adjusted table (AdjustInventory) 并创建和查询以显示销售和浪费/调整后的查询。
输出应该是这样的
Product SalesQty Value WastageQty Value
------------------------------------------------
Sales Qty 将来自 POSDETAIL 表,WastageQty 将来自 AdjustInventory
POSDETAIL 共有 435625 条记录,AdjustInventory 共有 183528 条记录。
我在下面设计了存储过程,它可以根据需要为我提供完美的输出,并且在查询分析器中运行速度非常快,但是在 Crystal Reports 上使用此存储过程变得非常非常慢,需要将近 15 到 25 分钟才能在报表上显示数据任何日期范围。
Create PROCEDURE MyDatabaseTest.ReportUser.sp_SalesWastage ()
BEGIN
DECLARE LOCAL TEMPORARY TABLE tblSumWastage (ProductId integer,TIMEORD date,WastedQty integer);
delete from tblSumWastage;
insert into tblSumWastage
select
DBA.AdjustInventory.INVENNUM as ProductId,
DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate,
SUM(AdjustInventory.ADJUSTUNITS) as WastedQty
from
DBA.POSDETAIL
join
DBA.AdjustInventory on DBA.POSDETAIL.PRODNUM = DBA.AdjustInventory.INVENNUM
and DBA.AdjustInventory.AdjustType = 9
and AdjustInventory.ADJUSTUNITS > 0
and DATEFORMAT(DBA.AdjustInventory.AdjustTime,'yyyy/mm/dd') = DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd')
group by
DBA.AdjustInventory.INVENNUM, DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd');
select
p.OrderDate, p.ProductId, p.SalesQty,
f.WastedQty / p.SalesQty as WastedQty,
p.EachCost
from
(select
POSDETAIL.PRODNUM as ProductId,
DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd') as OrderDate,
POSDETAIL.COSTEACH as EachCost,
SUM(POSDETAIL.QUAN) as SalesQty
from
DBA.POSDETAIL
group by
DATEFORMAT(POSDETAIL.TIMEORD,'yyyy/mm/dd'),
POSDETAIL.PRODNUM,POSDETAIL.COSTEACH
) as p (ProductId, OrderDate, EachCost, SalesQty)
inner join
(select * from tblSumWastage) as f (ProductId, OrderDate, WastedQty)
on p.ProductId = f.ProductId and p.OrderDate = f.OrderDate;
END
【问题讨论】:
-
统计,索引:重建。
-
Where 子句和 Group by 中的所有列都被索引,在查询分析器上运行完美,但在 Crystal Report 上非常慢。
-
"在查询分析器上运行完美,但在 Crystal Report 上却非常非常慢。" - 是的,我从你的问题中意识到这一点。再次阅读我的答案:“统计,索引:重建。”。
-
能否请您解释一下您的答案?谢谢
-
您的查询将忽略在同一日期没有匹配销售/订单的任何浪费,这是您想要的吗? (我还假设你不能得到
0和SalesQty的总数,否则你可能会遇到被零除的错误)。从外观上看,您应该能够组合这两个查询,这可能会有所帮助。什么 RDBMS 支持这个 - 它有DATE()函数吗?日期的格式最好留给显示层。但是,如果您要存储时间戳,则无法使用类似的东西。
标签: sql stored-procedures crystal-reports