【发布时间】: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