2016-12-29 8 views
-1

特定の場所の特定のアイテムの数量を表示する次のクエリがあります。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) 
+4

あなたは冗談でなければなりません。 https://stackoverflow.com/help/mcveを読んでください! – jarlh

+0

jarlh、大規模なクエリを指している場合は、ここでは専門家のために読むのがほとんどであり、難しいことではありません。 – Eclipse

+0

それは本当にポイントではありません。なぜ私はあなたを助けるためにそれを努力しなければならないのですか?根本的な問題を解決するためにクエリを簡略化します。あなたの質問に少し努力する必要があります – DCR

答えて

1

ビル、1つのアプローチは、在庫数のは、1によって膨張することはできませんので、あなたが他のテーブルに参加する前に、在庫量を合計することである:Mは、他のテーブルに結合します。

何かのように...(私はあなたのテーブル/データを持っていないので、これは未テストです)たぶん、ウィンドウ関数(再テストされていない)を使用して

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(CONVERT(INT, b.sum_bin_qty_stocks),0) AS inv 
    , dbo.pp_fnGetHoldbackQuantity(c.Channel_Index - 1, b.product_id) AS web_hb 
    , sum(CASE WHEN b.store_code = '0010' THEN CONVERT(INT, b.sum_bin_qty_stocks) - dbo.pp_fnGetHoldbackQuantity(c.Channel_Index - 1, b.product_id) 
      ELSE COALESCE(CONVERT(INT, b.sum_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 (SELECT sum(bin_qty_Stocks) as Sum_bin_Qty_Stocks, store_Code_Id, store_code, product_code, product_id 
       FROM pp_BUCKET b 
       WHERE Bin_Code in ('STORE', 'VW', 'V') 
       AND product_code = @inSKU 
       GROUP BY store_Code_Id, store_code, product_code, product_id) b 
     ON b.store_code_id = s.store_code_id 
    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 

が、私はケースを働かなければならないと思いますAND b.Bin_Code in ('STORE', 'VW', 'V') AND b.product_code = @inSKUに基づいて条件付き合計を処理するためには、最初のアプローチはクリーナー。

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(b.vin_qty_stocks) over (partition by b.store_code, b.product_code, b.product_id),0) as INV 
    , dbo.pp_fnGetHoldbackQuantity(c.Channel_Index - 1, b.product_id) AS web_hb 
    , sum(CASE WHEN b.store_code = '0010' THEN coalesce(sum(b.vin_qty_stocks) over (partition by b.store_code, b.product_code, b.product_id),0) - dbo.pp_fnGetHoldbackQuantity(c.Channel_Index - 1, b.product_id) 
      ELSE coalesce(sum(b.vin_qty_stocks) over (partition by b.store_code, b.product_code, b.product_id),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 

今、両方のこれらのは、あなたの代わりになるように@bucketテーブル内またはサブクエリとして「和は合計」生成された場合のALTの1つ以上が生成される1つの以上のレコードを持っているという仮定に基づいていますそれぞれのstore_Code_IDに対して1つのレコードしか得られませんでしたが、問題の根を修正したので上記のいずれかが必要ありません。

+0

あなたはそれを釘付けにした。私は最初の方法を試して、少し微調整して、私は正しい合計を持っています。私は数が正しいことを確認するためにいくつかのサンプルデータを使ってテストを続けます。私はここにあなたのような人がいっぱいいることを願っています。本当にありがとう。 – Eclipse

+0

私たちは喜んでください。問題の大部分を一度見て、再び発生したときにそれらを修正する方法を知っているのに十分な長さの問題です。それがうまくいくことを望みます。 – xQbert

+0

私はまだ問題があります。プライマリskuの最初の数量は修正されているようですが、altのものはまだ特定のストアに掛けています。 http://pastebin.com/erJyjB2zの私の完全なコードを見てください。あなたは私が何をしようとしているのか知っていますか?ありがとう。 – Eclipse

0

私は思う我々は解決できない問題(:2

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 
, COALESCE(SUM(CONVERT(INT, Alt1.bin_qty_stocks)),0) AS Alt1Qty 
, COALESCE(SUM(CONVERT(INT, Alt2.bin_qty_stocks)),0) AS Alt2Qty 
, COALESCE(SUM(CONVERT(INT, Alt3.bin_qty_stocks)),0) AS Alt3Qty 
, COALESCE(SUM(CONVERT(INT, Alt4.bin_qty_stocks)),0) AS Alt4Qty 
, COALESCE(SUM(CONVERT(INT, Alt5.bin_qty_stocks)),0) AS Alt5Qty 
, COALESCE(SUM(CONVERT(INT, Alt6.bin_qty_stocks)),0) AS Alt6Qty 

セクション: セクション1を見てする必要が実際には2つのセクションがあります。確かにこのSQLを表示するだけです)は、SQLを書き直して正気にするならばあなたには明らかになります。 SQLの機能と同じSQLを見つけることができます。

だから私たちは何を見ますか?まあaltStuffは奇妙な構造ですが、あなたがしたいことかもしれません。複数の行がある場合はうまくいきません。まず最初にそのサブクエリを実行して、1行だけを与えるかどうかを確認します。それがなければ(それは私が夕食を賭けることです)、それがあなたの問題です - あなたはそれを修正すべきです。

注:これはxQbertコメントでOVER句を修正しようとしていたのと同じ問題ですが、私はwith句を使用して、それを破ってきたので、この場合にはそれが明確です。

altStuffにない場合は、pp_channelがおそらく4行ある場合は問題です。それに失敗すると、私は問題が何であるか分かりません。あなたが何をやったかの

WITH altStuff AS 
(
    SELECT 
    Alt1.SKU AS Alt1SKU, 
    Alt2.SKU AS Alt2SKU, 
    Alt3.SKU AS Alt3SKU, 
    Alt4.SKU AS Alt4SKU, 
    Alt5.SKU AS Alt5SKU, 
    Alt6.SKU AS Alt6SKU, 
    ALT1.RegularPrice AS Alt1Price, 
    ALT2.RegularPrice AS Alt2Price, 
    ALT3.RegularPrice AS Alt3Price, 
    ALT4.RegularPrice AS Alt4Price, 
    ALT5.RegularPrice AS Alt5Price, 
    ALT6.RegularPrice AS Alt6Price, 
    ALT1.POSDescription AS Alt1Desc, 
    ALT2.POSDescription AS Alt2Desc, 
    ALT3.POSDescription AS Alt3Desc, 
    ALT4.POSDescription AS Alt4Desc, 
    ALT5.POSDescription AS Alt5Desc, 
    ALT6.POSDescription AS Alt6Desc, 
    COALESCE(SUM(CONVERT(INT, Alt1.bin_qty_stocks)),0) AS Alt1Qty, 
    COALESCE(SUM(CONVERT(INT, Alt2.bin_qty_stocks)),0) AS Alt2Qty, 
    COALESCE(SUM(CONVERT(INT, Alt3.bin_qty_stocks)),0) AS Alt3Qty, 
    COALESCE(SUM(CONVERT(INT, Alt4.bin_qty_stocks)),0) AS Alt4Qty, 
    COALESCE(SUM(CONVERT(INT, Alt5.bin_qty_stocks)),0) AS Alt5Qty, 
    COALESCE(SUM(CONVERT(INT, Alt6.bin_qty_stocks)),0) AS Alt6Qty, 
    FROM @ALT ALT1 
    CROSS JOIN @ALT ALT2 
    CROSS JOIN @ALT ALT3 
    CROSS JOIN @ALT ALT4 
    CROSS JOIN @ALT ALT5 
    CROSS JOIN @ALT ALT6 
    WHERE ALT1.RN = 1 AND ALT2.RN = 2 AND ALT3.RN = 3 AND ALT4.RN = 4 AND ALT5.RN = 5 AND ALT6.RN = 6 
) 
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, 
    altStuff.Alt1SKU, 
    altStuff.Alt1Qty, 
    altStuff.Alt2SKU, 
    altStuff.Alt2Qty, 
    altStuff.Alt3SKU, 
    altStuff.Alt3Qty, 
    altStuff.Alt4SKU, 
    altStuff.Alt4Qty, 
    altStuff.Alt5SKU, 
    altStuff.Alt5Qty, 
    altStuff.Alt6SKU, 
    altStuff.Alt6Qty, 
    altStuff.Alt1Price, 
    altStuff.Alt2Price, 
    altStuff.Alt3Price, 
    altStuff.Alt4Price, 
    altStuff.Alt5Price, 
    altStuff.Alt6Price, 
    altStuff.Alt1Desc, 
    altStuff.Alt2Desc, 
    altStuff.Alt3Desc, 
    altStuff.Alt4Desc, 
    altStuff.Alt5Desc, 
    altStuff.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 = altStuff.ALT1SKU 
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 = altStuff.ALT2SKU 
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 = altStuff.ALT3SKU 
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 = altStuff.ALT4SKU 
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 = altStuff.ALT5SKU 
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 = altStuff.ALT6SKU 
CROSS JOIN pp_Channel c 
CROSS JOIN altStuff   
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 
+0

ホーガン、私はこれを手伝ってくれてありがとうございます。私はここで私の完全なコードを貼り付けましたhttp://pastebin.com/erJyjB2zそれを見て私はあなたがしようとしているものについてはるかに良い画像を与えるだろう。 @ALTは複数の行を持つかもしれませんが、私の左の結合では行番号で選択していますので、ただ1つだけ返すべきです。上記のコードを見直します。ありがとう。 – Eclipse

+0

@Eclipse - 少なくとも私のコードを読んでそれを書くのに費やした時間を費やしてください。 **私はROW NUMBERで制限しました**これは問題がある行が1つも返されない場合、これはまさに私が言った理由です。あなたが記述する症状は、複数の行があることです。 – Hogan

+0

ホーガン、私はあなたがAltStuffでやっていることを見ています。しかし、私はこの行にエラーがあります。ALOM ALT1 CROSS JOIN ALT ALT1。私はそれらの2つの行にコメントし、行がない。また、bin_qty_stocks列はこの表にはありません。私がここに貼り付けたものを見るチャンスがあれば教えてくださいhttp://pastebin.com/erJyjB2zこれらの2つの一時テーブルにデータが表示されます。 – Eclipse

関連する問題