0

我正在创建水晶报表,但被卡住了。我有一张表(数字),里面有 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"

谢谢!!

4

1 回答 1

0

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

如果您在 numbers 表和“stores”表之间使用交叉连接来创建 numbers 和 store 之间的笛卡尔积会怎样。即,300 家商店中每个商店的每个项目编号的记录。通常我不会推荐这种方法,但由于我们谈论的实体数量相对较少,这可能会奏效。

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

于 2012-05-23T02:20:18.903 回答