SQL查询结果成倍增加并导致错误的结果

时间:2016-12-29 15:15:47

标签: sql sql-server tsql join left-join

我有以下查询,它会调出某些位置的特定商品的数量。

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

在此查询之前,我正在构建两个临时表@ALT和@BUCKET。在@ALT中,我正在为所提供的项目@inSKU存储备用项目代码。在@BUCKET中,我正在存储@ALT中所有项目的库存数量。

问题是,我在“inv”中获得了相乘的数量。如果有4个备用项目,则inv数量乘以4.我不明白为什么会发生这种情况,这就是为什么我要求一些帮助来识别这个问题。如果我注释掉Alt1Qty,Alt2Qty,Alt3Qty,Alt4Qty,Alt5Qty,Alt6Qty加入,我得到正确的结果。

请告知。

感谢。

更新:实际上有两个部分需要查看 第1节:

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

第2节:

    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)

2 个答案:

答案 0 :(得分: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表中生成“Sum totals”或者作为子查询生成了一个或多个alts,则生成的记录超过1个,因此只生成了1个记录对于每个store_Code_ID,这样你就不需要上面的任何一个,因为你已经修复了问题的根源。

答案 1 :(得分:0)

我认为如果我们重新编写SQL以便它是理智的,那么问题(我们无法解决以确保只是查看这个sql)将会变得清晰。下面你会发现sql在功能上与你发布的SQL相同。

那么我们看到了什么?好吧altStuff是一个奇怪的结构,但它可能是你想要做的。如果有多行,它将无法工作 - 所以首先检查 - 运行该子查询并查看它是否只给你一行。如果它没有(我正在吃晚餐)那么这就是你的问题 - 你应该解决它。

  

注意:这与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
相关问题