0

Crystal Report を作成中ですが、行き詰まっています。1 つのテーブル (Numbers) に 20 個のアイテムがあり、3 つの列 (item#、Price Per Order (PPO)、Cases Per Order (CPO)) があります。レポートは、各店舗のすべての販売注文を調べて、 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以上の店舗があるので、一度に1店舗ずつ運営するのは意味がありません. 問題は、すべての店舗で実行すると、すべてのアイテムが少なくとも 1 回注文されているため、null フィールドが表示されないことだと思います。

これがあまり混乱しないことを願っています。助言がありますか?


彼らは、レポートに各項目を支払い 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店舗のうちの1店舗ですべての商品を少なくとも1回購入したことがあれば、すべての店舗で一度に実行するという声明に気付いているのではないかと思います。

数値テーブルと「店舗」テーブルの間でクロス結合を使用して、数値と店舗の間にデカルト積を作成するとどうなりますか。つまり、300店舗ごとの各アイテム番号のレコードです。通常、このアプローチはお勧めしませんが、比較的少数のエンティティについて話しているので、これでうまくいく可能性があります。

クロス結合の結果を取得し、質問に含めたサブクエリに対して結合を実行します。今回は、アイテム番号だけでなくストアIDにも結合します。ストアIDに参加することで、各ストアで販売されている商品を分離できます。

于 2012-05-23T02:20:18.903 に答える