【发布时间】:2021-05-26 02:29:19
【问题描述】:
我需要在下面的 SQL 语句中加入多个表。与原始语句相比,当我添加这些连接时,总和大大增加了计数:
LEFT outer join pp_sku_pattern skupattern
ON skupattern.sp_sku_no = item.sku_no
LEFT outer join si_pi_shrinkages_hist pishretail
ON pish_inventory_date = :inventoryDate
AND
pish_sku_no = item.sku_no
AND
ROWNUM = 1
Left outer join si_store_cycle_counts cyclecounts
ON cyclecounts.scc_str_no = :storeNbr
AND
scc_sku = item.sku_no
带有仪表板数据视图的原始 SQL 语句: Original SQL statement with dashboard data view image (accurate counts)
带有仪表板数据视图的新 SQL 语句: New SQL statement with dashboard data view image (inaccurate counts)
具有正确总和计数的原始 SQL 语句:
SELECT dept.dept_code,
dept.dept_desc,
var.sprvh_inventory_date,
var.sprvh_store,
var.sprvh_sku,
brand.br_name,
item.sku_style,
SUM(var.sprvh_phys_qty),
SUM(var.sprvh_book_qty),
SUM(var.sprvh_curr_variance),
SUM(var.sprvh_hist_variance),
SUM(var.sprvh_revision_number)
FROM si_pi_research_var_hist var
left outer join pp_stock_keeping_units item
ON var.sprvh_sku = item.sku_no
AND var.sprvh_company_code = item.sku_company_code
left outer join pp_departments dept
ON dept.dept_company_code = item.sku_company_code
AND dept.dept_code = item.sku_dept_code
left outer join pp_brands brand
ON brand.br_id = item.sku_br_id
WHERE var.sprvh_inventory_date = :inventoryDate
AND VAR.sprvh_store = :storeNbr
AND ( ( var.sprvh_phys_qty IS NOT NULL
AND var.sprvh_phys_qty <> 0 )
OR ( var.sprvh_book_qty IS NOT NULL
AND var.sprvh_book_qty <> 0 )
OR ( var.sprvh_curr_variance IS NOT NULL
AND var.sprvh_curr_variance <> 0 )
OR ( var.sprvh_hist_variance IS NOT NULL
AND var.sprvh_hist_variance <> 0 ) )
GROUP BY dept.dept_code,
dept.dept_desc,
var.sprvh_inventory_date,
var.sprvh_store,
var.sprvh_sku,
brand.br_name,
item.sku_style
HAVING SUM(var.sprvh_curr_variance) <> 0
OR SUM(var.sprvh_hist_variance) <> 0
ORDER BY Abs(SUM(var.sprvh_curr_variance))
产生错误总和计数的全新 SQL 语句:
SELECT dept.dept_code,
dept.dept_desc,
var.sprvh_inventory_date,
var.sprvh_store,
var.sprvh_sku,
brand.br_name,
item.sku_style,
skupattern.sp_pattern,
pishretail.pish_retail,
cyclecounts.scc_reason_process_flag,
SUM(var.sprvh_phys_qty),
SUM(var.sprvh_book_qty),
SUM(var.sprvh_curr_variance),
SUM(var.sprvh_hist_variance),
SUM(var.sprvh_revision_number)
FROM si_pi_research_var_hist var
left outer join pp_stock_keeping_units item
ON var.sprvh_sku = item.sku_no
AND var.sprvh_company_code = item.sku_company_code
left outer join pp_departments dept
ON dept.dept_company_code = item.sku_company_code
AND dept.dept_code = item.sku_dept_code
left outer join pp_brands brand
ON brand.br_id = item.sku_br_id
left outer join pp_sku_pattern skupattern
ON skupattern.sp_sku_no = item.sku_no
left outer join si_pi_shrinkages_hist pishretail
ON pishretail.pish_inventory_date = :inventoryDate
AND pish_sku_no = item.sku_no
AND ROWNUM = 1
left outer join si_store_cycle_counts cyclecounts
ON cyclecounts.scc_str_no = :storeNbr
AND scc_sku = item.sku_no
WHERE var.sprvh_inventory_date = :inventoryDate
AND VAR.sprvh_store = :storeNbr
AND ( ( var.sprvh_phys_qty IS NOT NULL
AND var.sprvh_phys_qty <> 0 )
OR ( var.sprvh_book_qty IS NOT NULL
AND var.sprvh_book_qty <> 0 )
OR ( var.sprvh_curr_variance IS NOT NULL
AND var.sprvh_curr_variance <> 0 )
OR ( var.sprvh_hist_variance IS NOT NULL
AND var.sprvh_hist_variance <> 0 ) )
GROUP BY dept.dept_code,
dept.dept_desc,
var.sprvh_inventory_date,
var.sprvh_store,
var.sprvh_sku,
brand.br_name,
item.sku_style,
skupattern.sp_pattern,
pishretail.pish_retail,
cyclecounts.scc_reason_process_flag
HAVING SUM(var.sprvh_curr_variance) <> 0
OR SUM(var.sprvh_hist_variance) <> 0
ORDER BY Abs(SUM(var.sprvh_curr_variance))
问题:如何在新的 SQL 语句中保持原始语句总和与 3 个新连接相同?
【问题讨论】:
-
那么问题是什么?您知道,如果您连接到一个连接键不唯一的表,您会乘以当前记录,从而更改总和。所以你必须在新的连接中禁止它,例如将
rownum = 1谓词添加到缺少它的另外两个连接中。 -
您真的希望任何人都这样阅读查询吗?至少格式化一下。你可以格式化here
-
@MarmiteBomber 问题是:如何保持原始语句总和相同?感谢您的回答,我将尝试将 rownum = 1 谓词添加到缺少它的另外两个连接中,并让您知道:)
-
@OldProgrammer 请告诉我如何更好地格式化它,我是新手 :)
-
@OldProgrammer 谢谢,我已经更新了格式:)