несколько внутренних объединений добавляет дополнительные значения для подсчета - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь включить результаты из других таблиц в предыдущий запрос, используя несколько следующих соединений:

SELECT mid                             as mID,
   round((x.qty_sum / x.qty_count), 5) as qtAVG,
   round(x.qty_stddev, 5)              as qtSTDDEV,
   x.qty_count                         as qtCOUNT,
   round((x.rel_sum / x.rel_count), 5) as relAVG,
   round(x.rel_stddev, 5)              as relSTDDEV,
   x.rel_count                         as relCOUNT,
FROM (SELECT t.mid,
         SUM( mt = 'qt' )   as qty_count,
         SUM(CASE WHEN t_r.mt = 'qt' THEN rt END)  as qty_sum,
         STD(CASE WHEN t_r.mt = 'qt' THEN rt END)  as qty_stddev,
         SUM( t_r.mt = 'rel' ) as rel_count,
         SUM(CASE WHEN t_r.mt = 'rel' THEN rel END) as rel_sum,
         STD(CASE WHEN t_r.mt = 'rel' THEN rel END) as rel_stddev
  FROM t_r r
right join t_m t on t.mid = r.mid
right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid
  GROUP BY t.mid
 ) x;

Используя мой запрос выше, qty_count для 111, когда mt это qt возвращает 6 вместо 2.2 * (count of 111 in table m_k)

Когда я удаляю эту часть объединения, я получаю желаемую сумму для qtCOUNT и relCOUNT

right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid

Что я делаю неправильно и как я могу решитьэто?

Данные:

м_к

mid  kid
--------
109  2
110  2
110  4
111  1
111  2
111  3

к_д

kid  k_desc
-----------
1    desc1
2    desc2
3    desc3
4    desc4

м_д

mid  col1   col2   col3   col4
-------------------------------
109  val_a  val_d  val_g  val_j
110  val_b  val_e  val_h  val_k
111  val_c  val_f  val_i  val_l

т_р

mid  rt  stamp                  mt
----------------------------------
111  3   2018-12-08 01:30:31   rel
111  4   2018-12-08 03:41:56   qt
111  3   2018-12-08 02:29:10   qt
110  1   2018-12-08 06:13:51   rel
110  5   2018-12-08 11:44:39   qt
109  1   2018-12-08 10:39:51   rel

Другие запросы, которые достигают того же, что и выше, в порядке.

1 Ответ

0 голосов
/ 14 декабря 2018

Я решил эту проблему, переместив

right join m_k m on m.mid = t.mid
right join k_d k on m.kid = k.kid

за пределы производной таблицы x.Окончательный запрос выглядит так:

SELECT mid                             as mID,
   round((x.qty_sum / x.qty_count), 5) as qtAVG,
   round(x.qty_stddev, 5)              as qtSTDDEV,
   x.qty_count                         as qtCOUNT,
   round((x.rel_sum / x.rel_count), 5) as relAVG,
   round(x.rel_stddev, 5)              as relSTDDEV,
   x.rel_count                         as relCOUNT,
FROM (SELECT mid,
         SUM( mt = 'qt' )   as qty_count,
         SUM(CASE WHEN mt = 'qt' THEN rt END)  as qty_sum,
         STD(CASE WHEN mt = 'qt' THEN rt END)  as qty_stddev,
         SUM( mt = 'rel' ) as rel_count,
         SUM(CASE WHEN mt = 'rel' THEN rel END) as rel_sum,
         STD(CASE WHEN mt = 'rel' THEN rel END) as rel_stddev
  FROM t_r r
right join t_m t on t.mid = r.mid
  GROUP BY mid
 ) x
right join m_k m on m.mid = x.mid
right join k_d k on k.kid = m.kid
group by m.mid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...