【问题标题】:SQL query result multiplied and brings up wrong resultSQL查询结果成倍增加报错结果
【发布时间】:2017-05-13 22:34:12
【问题描述】:

我有以下查询,它会显示来自某些位置的某些商品的数量。

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)

【问题讨论】:

  • 你一定是在开玩笑。阅读stackoverflow.com/help/mcve
  • jarlh,如果您指的是大型查询,它大多是重复的,对于这里的专家来说并不难阅读。
  • 这真的不是重点。为什么我要那么努力地帮助你?简化您的查询以帮助解决根本问题。你需要在你的问题上付出一点努力
  • 更新了我的问题。我一直认为信息越多越好:)
  • 这些左连接是否会导致多于 1 行的连接? (他们必须)这意味着您需要在连接之前获取库存或使用窗口函数(如果支持仅按 pp_BUCKET 表中的库存分区):coalesce(SUM(CONVERT(INT, case when b.Bin_Code in ('STORE', 'VW', 'V') then b.bin_qty_stocks else 0 end)),0) over (partition by b.store_Code_ID) AS inv

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


【解决方案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,那么您不需要上述任何一种,因为您已经解决了问题的根源。

【讨论】:

  • 你成功了。我尝试了第一种方法,稍作调整,我得到了正确的总和。我将使用更多样本数据继续测试,以确保数字正确。我希望这里和任何地方都有更多像你这样的人。非常感谢。
  • 我们的目标是取悦。这是一个足够长的时间来看到大多数问题一次并知道当它们再次出现时如何解决它们的问题。希望一切顺利。
  • 我还有一个问题。似乎主要 sku 的第一个数量是修复的,但对于 alt 的,它仍然在特定商店成倍增加。您能否在这里查看我的完整代码pastebin.com/erJyjB2z,以便您知道我要做什么?谢谢。
  • 如果我从这些语句中删除 SUM 就可以了... , COALESCE(CONVERT(INT, sib1.bin_qty_stocks),0) AS Sib1Qty , (SELECT SKU FROM @SIBS WHERE RN = 2) AS Sib2SKU , COALESCE(CONVERT(INT, sib2.bin_qty_stocks),0) AS Sib2Qty 但如果我这样做,我不确定我是否总是得到正确的结果。另外,我需要在 group by 子句中添加这些 (sib1.bin_qty_stocks) 迭代中的每一个
  • 如果您有任何改进建议,请告诉我。谢谢。
【解决方案2】:

我认为,如果我们重新编写 SQL 以使其正常运行,您将清楚问题(仅查看此 sql 无法确定)。您将在下面找到与您发布的 SQL 功能相同的 sql。

那么我们看到了什么?那么 altStuff 是一个奇怪的结构,但它可能是你想要做的。如果有不止一行,它将不起作用——所以首先检查一下——运行该子查询,看看它是否只给你一行。如果没有(我会赌上一顿晚餐),那就是你的问题——你应该解决它。

注意:这与 xQbert 将使用 cmets 中的 OVER 子句修复的问题相同,但在这种情况下它更清楚,因为我使用 with 子句打破了它。

如果它不在 altStuff 中,那么如果它有 4 行,那么 pp_channel 可能就是问题所在。如果做不到这一点,我不知道问题出在哪里。

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

【讨论】:

  • Hogan,非常感谢您为帮助我所做的努力。我已经将我的完整代码粘贴在这里pastebin.com/erJyjB2z 看看那会让你更好地了解我正在尝试做的事情。 @ALT 可能有多行,但在我的左连接中,我按行号选择,所以它应该只返回一个。我现在将查看您上面的代码。谢谢。
  • @Eclipse -- 请至少花与我编写代码一样多的时间阅读和理解我的代码。 我确实按行号限制这正是我说如果它不返回一行你就有问题的原因。你描述的症状是不止一行。
  • Hogan,我知道你在用 AltStuff 做什么。但是,我在 FROM ALT ALT1 CROSS JOIN ALT ALT1 的这一行确实收到了错误。我评论了这两行并且没有行。此外, bin_qty_stocks 列不在此表中。如果您有机会查看我在此处粘贴的内容,请告诉我 pastebin.com/erJyjB2z 您将在这两个临时表中看到数据。
  • 是的,第一个交叉连接应该被删除(我已经这样做了。)你上面的例子看起来不对。 EG你说FROM ALT ALT1我有FROM @ALT ALT1
  • 我不会去 pastebin 看看你的更多代码——先应用我到目前为止向你展示的内容。除非你聘请我作为顾问——通过 stackoverflow 的工作功能联系我——但我怀疑你是否负担得起。
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2021-11-15
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
相关资源
最近更新 更多