изменение запроса в db2, чтобы зафиксировать счетчик из объединения - PullRequest
0 голосов
/ 28 сентября 2018

Я получаю агрегированное количество записей для заказов и получаю ожидаемое количество для этого базового запроса:

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. Все, что мне нужно от этих объединений, это идентификатор клиента и номер менеджера.так что даже если мой счет высокий, я просто пытаюсь сказать "для этого cstnoc, дайте мне slsupr и xlsno"

Как я могу выполнить этот запрос ниже, не влияя на количество?Я только хочу, чтобы мой счетчик (sales_180 и скорость) исходил из таблицы custgroup на основе моего предложения where, но тогда я просто хочу одно значение xcstno и xslsno на основе cstnoc.

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 голосов
/ 28 сентября 2018

Вы производите несколько строк при объединении, поэтому ваш счетчик теперь считает все результирующие строки со всей этой [непреднамеренной] кратностью.

Решение?Используйте табличное выражение для предварительного вычисления вашего счета, а затем вы можете присоединить его к другим таблицам, например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...