【问题标题】:SQL drastically increasing SUMS from multiple JOINSSQL 大幅增加来自多个 JOINS 的总和
【发布时间】: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 谢谢,我已经更新了格式:)

标签: java sql oracle join


【解决方案1】:

您的问题来自您用于连接的非唯一值。 例如:

 left outer join si_store_cycle_counts cyclecounts
                    ON cyclecounts.scc_str_no = :storeNbr
                       AND scc_sku = item.sku_no

首先。尝试为每个表字段使用表别名。

 left outer join si_store_cycle_counts cyclecounts
                    ON cyclecounts.scc_str_no = :storeNbr
                       AND cyclecounts.scc_sku = item.sku_no

第二。检查每个连接条件。举个例子。如果 join 从 si_pi_research_var_hist 中返回多于一行,则从连接表中返回一行。

【讨论】:

  • 现在试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多