特定の場所の特定のアイテムの数量を表示する次のクエリがあります。SQLクエリの結果が掛け算され、間違った結果が返される
SELECT l.region, l.Region_Description, s.store_code AS store, s.name, s.city, p.province_code, s.telephone, b.store_code, b.product_code, b.product_id,
COALESCE(SUM(CONVERT(INT, b.bin_qty_stocks)),0) AS inv
, dbo.pp_fnGetHoldbackQuantity(c.Channel_Index - 1, b.product_id) AS web_hb
, CASE WHEN b.store_code = '0010' THEN SUM(CONVERT(INT, b.bin_qty_stocks)) - dbo.pp_fnGetHoldbackQuantity(c.Channel_Index - 1, b.product_id)
ELSE COALESCE(SUM(CONVERT(INT, b.bin_qty_stocks)),0) END AS inv_avail
, (SELECT SKU FROM @ALT WHERE RN = 1) AS Alt1SKU
, COALESCE(SUM(CONVERT(INT, Alt1.bin_qty_stocks)),0) AS Alt1Qty
, (SELECT SKU FROM @ALT WHERE RN = 2) AS Alt2SKU
, COALESCE(SUM(CONVERT(INT, Alt2.bin_qty_stocks)),0) AS Alt2Qty
, (SELECT SKU FROM @ALT WHERE RN = 3) AS Alt3SKU
, COALESCE(SUM(CONVERT(INT, Alt3.bin_qty_stocks)),0) AS Alt3Qty
, (SELECT SKU FROM @ALT WHERE RN = 4) AS Alt4SKU
, COALESCE(SUM(CONVERT(INT, Alt4.bin_qty_stocks)),0) AS Alt4Qty
, (SELECT SKU FROM @ALT WHERE RN = 5) AS Alt5SKU
, COALESCE(SUM(CONVERT(INT, Alt5.bin_qty_stocks)),0) AS Alt5Qty
, (SELECT SKU FROM @ALT WHERE RN = 6) AS Alt6SKU
, COALESCE(SUM(CONVERT(INT, Alt6.bin_qty_stocks)),0) AS Alt6Qty
, (SELECT RegularPrice FROM @ALT WHERE RN = 1) AS Alt1Price
, (SELECT RegularPrice FROM @ALT WHERE RN = 2) AS Alt2Price
, (SELECT RegularPrice FROM @ALT WHERE RN = 3) AS Alt3Price
, (SELECT RegularPrice FROM @ALT WHERE RN = 4) AS Alt4Price
, (SELECT RegularPrice FROM @ALT WHERE RN = 5) AS Alt5Price
, (SELECT RegularPrice FROM @ALT WHERE RN = 6) AS Alt6Price
, (SELECT POSDescription FROM @ALT WHERE RN = 1) AS Alt1Desc
, (SELECT POSDescription FROM @ALT WHERE RN = 2) AS Alt2Desc
, (SELECT POSDescription FROM @ALT WHERE RN = 3) AS Alt3Desc
, (SELECT POSDescription FROM @ALT WHERE RN = 4) AS Alt4Desc
, (SELECT POSDescription FROM @ALT WHERE RN = 5) AS Alt5Desc
, (SELECT POSDescription FROM @ALT WHERE RN = 6) AS Alt6Desc
FROM store s
INNER JOIN province p
ON p.province_id = s.province_id
INNER JOIN pp_vStoreLevels l
ON l.store_code_id = s.store_Code_id
LEFT JOIN pp_BUCKET b
ON b.store_code_id = s.store_code_id
AND b.Bin_Code in ('STORE', 'VW', 'V')
AND b.product_code = @inSKU
LEFT JOIN @BUCKET Alt1
ON Alt1.store_code_id = s.store_code_id
AND Alt1.Bin_Code in ('STORE', 'VW', 'V')
AND Alt1.product_code in (SELECT SKU FROM @ALT WHERE RN = 1)
LEFT JOIN @BUCKET Alt2
ON Alt2.store_code_id = s.store_code_id
AND Alt2.Bin_Code in ('STORE', 'VW', 'V')
AND Alt2.product_code in (SELECT SKU FROM @ALT WHERE RN = 2)
LEFT JOIN @BUCKET Alt3
ON Alt3.store_code_id = s.store_code_id
AND Alt3.Bin_Code in ('STORE', 'VW', 'V')
AND Alt3.product_code in (SELECT SKU FROM @ALT WHERE RN = 3)
LEFT JOIN @BUCKET Alt4
ON Alt4.store_code_id = s.store_code_id
AND Alt4.Bin_Code in ('STORE', 'VW', 'V')
AND Alt4.product_code in (SELECT SKU FROM @ALT WHERE RN = 4)
LEFT JOIN @BUCKET Alt5
ON Alt5.store_code_id = s.store_code_id
AND Alt5.Bin_Code in ('STORE', 'VW', 'V')
AND Alt5.product_code in (SELECT SKU FROM @ALT WHERE RN = 5)
LEFT JOIN @BUCKET Alt6
ON Alt6.store_code_id = s.store_code_id
AND Alt6.Bin_Code in ('STORE', 'VW', 'V')
AND Alt6.product_code in (SELECT SKU FROM @ALT WHERE RN = 6)
CROSS JOIN pp_Channel c
WHERE (((l.region IS NOT NULL) AND (l.region <> '099')) OR (l.store = '0010'))
AND s.store_code <> '0012'
AND (l.date_opened <= GETDATE())
AND ((l.date_closed IS NULL) OR (l.date_closed > GETDATE()))
AND c.channel_description = 'TEST'
GROUP BY l.region, l.region_description, s.store_code, s.name, s.city, p.province_code, s.telephone
, b.store_code, b.product_code, b.product_id, c.Channel_Index
このクエリの前に、2つの一時テーブル@ALTと@BUCKETを作成しています。 @ALTでは、提供アイテム@inSKUの代替アイテムコードを保存しています。 @ BUCKETでは、@ALTにあるすべてのアイテムの在庫数量を保管しています。
問題は、「inv」に掛けられた数量が増えていることです。 4つの代替アイテムがある場合、inv量に4が乗算されます。なぜこの問題が発生するのかわかりません。そのため、この問題を特定するためのヘルプが必要です。 Alt1Qty、Alt2Qty、Alt3Qty、Alt4Qty、Alt5Qty、Alt6Qtyを結合してコメントアウトすると、正しい結果が得られます。
お知らせください。
ありがとうございました。
更新:
LEFT JOIN pp_BUCKET b
ON b.store_code_id = s.store_code_id
AND b.product_code = @inSKU
LEFT JOIN @BUCKET Alt1
ON Alt1.store_code_id = s.store_code_id
AND Alt1.product_code in (SELECT SKU FROM @ALT WHERE RN = 1)
LEFT JOIN @BUCKET Alt2
ON Alt2.store_code_id = s.store_code_id
AND Alt2.product_code in (SELECT SKU FROM @ALT WHERE RN = 2)
LEFT JOIN @BUCKET Alt3
ON Alt3.store_code_id = s.store_code_id
AND Alt3.product_code in (SELECT SKU FROM @ALT WHERE RN = 3)
LEFT JOIN @BUCKET Alt4
ON Alt4.store_code_id = s.store_code_id
AND Alt4.product_code in (SELECT SKU FROM @ALT WHERE RN = 4)
LEFT JOIN @BUCKET Alt5
ON Alt5.store_code_id = s.store_code_id
AND Alt5.product_code in (SELECT SKU FROM @ALT WHERE RN = 5)
LEFT JOIN @BUCKET Alt6
ON Alt6.store_code_id = s.store_code_id
AND Alt6.product_code in (SELECT SKU FROM @ALT WHERE RN = 6)
あなたは冗談でなければなりません。 https://stackoverflow.com/help/mcveを読んでください! – jarlh
jarlh、大規模なクエリを指している場合は、ここでは専門家のために読むのがほとんどであり、難しいことではありません。 – Eclipse
それは本当にポイントではありません。なぜ私はあなたを助けるためにそれを努力しなければならないのですか?根本的な問題を解決するためにクエリを簡略化します。あなたの質問に少し努力する必要があります – DCR