更改db2中的查询以修复联接中的计数

时间:2018-09-28 19:44:41

标签: sql db2

我正在获取订单记录的总计数,并且在此基本查询中得到了预期的计数:

SELECT
    count(*) as sales_180,
    180/count(*) as velocity

FROM custgroup g

WHERE g.cstnoc = 10617
    AND g.framec = 4847
    AND g.covr1c = 1763
    AND g.colr1c = 29
    AND date(substr(g.extd1d,1,4)||'-'||substr(g.EXTD1d,5,2)||'-'||substr(g.EXTD1d,7,2) ) between current_Date - 180 DAY AND current_Date

但是,一旦我重新添加联接和联接值,我的数量就会从1(应该是)增加到200以上。这些联接中我所需要的只是客户ID和经理编号。所以即使我的人数很高,我基本上也只是想说“为此cstnoc,请给我slsupr和xlsno”

如何在不影响计数的情况下执行以下查询?我只希望我的计数(sales_180和力度)来自基于我的where子句的custgroup表,但是我只想要基于cstnoc的xcstno和xslsno值。

SELECT
    count(*) as sales_180,
    180/count(*) as velocity,
    c.xslsno as CustID,
    cr.slsupr as Manager

FROM custgroup g
    inner join customers c
        on g.cstnoc = c.xcstno
    inner join managers cr
        on c.xslsno = cr.xslsno

WHERE g.cstnoc = 10617
    AND g.framec = 4847
    AND g.covr1c = 1763
    AND g.colr1c = 29
    AND date(substr(g.extd1d,1,4)||'-'||substr(g.EXTD1d,5,2)||'-'||substr(g.EXTD1d,7,2) ) between current_Date - 180 DAY AND current_Date
    GROUP BY c.xslsno, cr.slsupr

1 个答案:

答案 0 :(得分:1)

您在加入时会产生多行,因此您的计数现在是在计算所有具有[非预期]多重性的结果行。

解决方案?使用表表达式预先计算您的计数,然后可以将其连接到其他表,如:

select
    g2.sales_180,
    g2.velocity,
    c.xslsno as CustID,
    cr.slsupr as Manager
  from customers c
  join managers cr on c.xslsno = cr.xslsno
  join ( -- here the Table Expression starts
SELECT
    count(*) as sales_180,
    180/count(*) as velocity
FROM custgroup g
WHERE g.cstnoc = 10617
    AND g.framec = 4847
    AND g.covr1c = 1763
    AND g.colr1c = 29
    AND date(substr(g.extd1d,1,4)||'-'||substr(g.EXTD1d,5,2)
        ||'-'||substr(g.EXTD1d,7,2) ) 
        between current_Date - 180 DAY AND current_Date
  ) g2 on g2.cstnoc = c.xcstno

您还可以使用将产生相同结果的通用表表达式(CTE):

with g2 as (        
  SELECT
      count(*) as sales_180,
      180/count(*) as velocity
  FROM custgroup g
  WHERE g.cstnoc = 10617
    AND g.framec = 4847
    AND g.covr1c = 1763
    AND g.colr1c = 29
    AND date(substr(g.extd1d,1,4)||'-'||substr(g.EXTD1d,5,2)
        ||'-'||substr(g.EXTD1d,7,2) ) 
        between current_Date - 180 DAY AND current_Date
  )
select
    g2.sales_180,
    g2.velocity,
    c.xslsno as CustID,
    cr.slsupr as Manager
  from customers c
  join managers cr on c.xslsno = cr.xslsno
  join g2 on g2.cstnoc = c.xcstno
相关问题