Crystal Reports查询 - 未获得正确的结果

时间:2012-05-22 16:30:58

标签: sql crystal-reports report

我正在创建一个Crystal Report,但我被卡住了。我有一个表(Numbers),其中有20个项目,3列(项目#,每个订单的价格(PPO),每个订单的案例(CPO)。报告应该查看我们每个商店的所有销售订单和如果他们在CPO之下或之上订购,则按项目打印出多少收入损失或获得。我遇到的问题是有些商店没有订购20件商品中的一些,但我仍然需要这些在报告中显示为收入损失。我知道这主要是通过Numbers表中的左连接完成的。我现在的查询是:


SELECT x.*, z.*
FROM NUMBERS x 
LEFT OUTER JOIN (
SELECT  
        BPCUSTOMER.BPCPYR_0 AS PayingBp,
        BPCUSTOMER.BPCNUM_0 AS BpNumber,
        ITMMASTER.ITMREF_0 AS ITMREF,
        SUM(SINVOICED.NETPRI_0) AS NETPRI,
        SUM(SINVOICED.QTY_0) AS Quantity,
        MAX(SINVOICED.ITMDES1_0) AS DES,
        MAX(BPADDRESS.CTY_0) AS BpCity,
        MAX(BPADDRESS.SAT_0) AS BpState

      FROM SINVOICED SINVOICED
        INNER JOIN BPCUSTOMER ON SINVOICED.BPCINV_0 = BPCUSTOMER.BPCNUM_0
        INNER JOIN ITMMASTER ON SINVOICED.ITMREF_0 = ITMMASTER.ITMREF_0
        INNER JOIN BPADDRESS ON SINVOICED.BPCINV_0 = BPADDRESS.BPANUM_0
        INNER JOIN BPCUSTOMER_PAY ON BPCUSTOMER.BPCINV_0 = BPCUSTOMER_PAY.BPCNUM_0

      WHERE (ITMMASTER.TSICOD_2 = N'YE1') 
        AND (BPCUSTOMER.BPCPYR_0 > N'10110')
      GROUP BY BPCUSTOMER.BPCPYR_0, BPCUSTOMER.BPCNUM_0, ITMMASTER.ITMREF_0

) z ON x.[Item #] = z.ITMREF

使用此查询,我不会获得任何NULL信息。如果我将特定商店添加到WHERE部分,它会得到正确的结果,但仅适用于那个特定商店。我们有超过300家商店,所以我一次只经营一家商店是没有意义的。我猜测问题是,当为所有商店运行它时,每个项目至少被排序一次,因此它不会显示空字段。

希望这不会太混乱。有什么建议吗?


他们希望报告显示通过支付bp然后按商店编号分组的每个项目。这是一个SQL数据库,但我从Crystal Reports中获取了查询,并且我试图操纵它以获得正确的结果。

但我已经改变了请求。他们现在只想看到根本没有购买的物品。我仍在尝试使用NUMBERS表的左外连接来执行此操作,但仍然遇到同样的问题。我现在的查询是:

 SELECT "ZP_ITMMASTER"."ITMREF_0", "ZP_ITMMASTER"."ITMDES1_0", "ZP_NUMBERS"."Avg # Cases per order", "ZP_NUMBERS"."Price per order", "ZP_SDELIVERY"."BPCPYR_0", "ZP_SDELIVERY"."BPCORD_0", "ZP_NUMBERS"."Item #", "ZP_ITMMASTER"."TSICOD_2"
 FROM   (("master"."dbo"."ZP_NUMBERS" "ZP_NUMBERS" LEFT OUTER JOIN "master"."dbo"."ZP_SDELIVERYD" "ZP_SDELIVERYD" ON "ZP_NUMBERS"."Item #"="ZP_SDELIVERYD"."ITMREF_0") INNER JOIN "master"."dbo"."ZP_SDELIVERY" "ZP_SDELIVERY" ON (("ZP_SDELIVERYD"."SDHNUM_0"="ZP_SDELIVERY"."SDHNUM_0") AND ("ZP_SDELIVERYD"."SOHNUM_0"="ZP_SDELIVERY"."SOHNUM_0")) AND ("ZP_SDELIVERYD"."STOFCY_0"="ZP_SDELIVERY"."STOFCY_0")) INNER JOIN "master"."dbo"."ZP_ITMMASTER" "ZP_ITMMASTER" ON "ZP_SDELIVERYD"."ITMREF_0"="ZP_ITMMASTER"."ITMREF_0"
 WHERE  "ZP_ITMMASTER"."TSICOD_2"=N'YE1'
 ORDER BY "ZP_SDELIVERY"."BPCPYR_0", "ZP_SDELIVERY"."BPCORD_0", "ZP_ITMMASTER"."ITMREF_0"

谢谢!

1 个答案:

答案 0 :(得分:0)

我同意@noa,我不认为这是一个Crystal问题,更可能是SQL查询问题。也就是说,如果每个产品至少被300家商店中的一家购买过,我怀疑你可能会对你的所有商店同时运行它的声明。

如果您在数字表和“商店”表之间使用cross join来在数字和商店之间创建笛卡尔积,该怎么办?也就是说,300个商店中每个商店的每个商品编号的记录。通常情况下我不会推荐这种方法,但由于我们说的是相对较少数量的实体,这可能会起到作用。

获取交叉联接的结果并针对您在问题中包含的子查询执行联接,这次不仅会加入项目#,还会加入商店ID。通过加入商店ID,您可以隔离每个商店销售的产品。