Как объединить операторы SQL с разными предложениями where в разных столбцах одной и той же таблицы - PullRequest
0 голосов
/ 02 июля 2018

У меня есть 3 запроса в sql:

1-й запрос:

select t1ID ,AVG(t2score) AS AVG1
from T1
WHERE t1m1 NOT IN (t2m1,t2m2,t2m3) and t1m2 IN (t2m1,t2m2,t2m3)
group by t1ID

Результат

+------+------+
| t1ID | AVG1 |
+------+------+
|    1 |   55 |
|    2 |   45 |
|    3 |   73 |
|    4 |   69 |
+------+------+

2-й запрос:

select t1ID ,AVG(t2score) AS AVG2
from T1
WHERE t1m2 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)
group by t1ID

Результат

+------+------+
| t1ID | AVG2 |
+------+------+
|    1 | 68   |
|    2 | 56   |
|    3 | NULL |
|    4 | NULL |
+------+------+

3-й запрос

select t1ID ,AVG(t2score) AS AVGt3
from T1
WHERE t1m3 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)
group by t1ID

Результат

+------+------+
| t1ID | AVG3 |
+------+------+
|    1 | NULL |
|    2 | 70   |
|    3 | NULL |
|    4 | NULL |
+------+------+

Как я могу объединить эти три утверждения так, чтобы эти результаты складывались вместе, как это (каждая оценка AVG в отдельном столбце)

Желаемый результат:

+------+------+------+------+
| t1ID | AVG1 | AVG2 | AVG3 |
+------+------+------+------+
|    1 |   55 | 68   | NULL |
|    2 |   45 | 56   | 70   |
|    3 |   73 | NULL | NULL |
|    4 |   69 | NULL | NULL |
+------+------+------+------+

Ответы [ 5 ]

0 голосов
/ 04 июля 2018
{SELECT t1ID, AVG(FirstT.t2score) AS AVG1, AVG(SecondT.t2score) AS AVG1, AVG(ThirdT.t2score) AS AVG1
FROM T1 t
JOIN T1 FirstT ON FirstT.t1ID = t.t1ID AND FirstT.t1m1 NOT IN (t2m1,t2m2,t2m3) AND FirstT.t1m2 IN (t2m1,t2m2,t2m3)
JOIN T1 SecondT ON SecondT.t1ID = t.t1ID AND SecondT.t1m2 NOT IN (t2m1,t2m2,t2m3) AND SecondT.t1m1 IN (t2m1,t2m2,t2m3)
JOIN T1 ThirdT ON ThirdT.t1ID = t.t1ID AND FirstT.t1m3 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)enter code here
GROUP BY t1ID}
0 голосов
/ 02 июля 2018

Вы можете сделать SELECT только из идентификаторов, а затем (LEFT) JOIN подзапросы для идентификаторов, как это:

select t1ID, AVG1, AVG2, AVG3 FROM 
(SELECT t1ID FROM T1 GROUP BY t1ID) AS IDs
JOIN (select t1ID ,AVG(t2score) AS AVG1
from T1
WHERE t1m1 NOT IN (t2m1,t2m2,t2m3) and t1m2 IN (t2m1,t2m2,t2m3)
group by t1ID) AS group1 USING (t1ID)
JOIN (select t1ID ,AVG(t2score) AS AVG2
from T1
WHERE t1m2 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)
group by t1ID) AS group2 USING (t1ID)
JOIN (select t1ID ,AVG(t2score) AS AVG3
from T1
WHERE t1m3 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)
group by t1ID) AS group3 USING (t1ID)

Вы должны дать каждому подзапросу псевдоним таблицы.

0 голосов
/ 02 июля 2018

Условное агрегирование, упомянутое в комментариях, работает, помещая выражение CASE в вызов функции AVG(), таким образом, усредняя только значения, которые соответствуют определенным критериям ...

SELECT
   t1ID,
   AVG(CASE WHEN t1m1 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3) THEN t2Score END)   AVG1,
   AVG(CASE WHEN t1m2 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3) THEN t2Score END)   AVG2,
   AVG(CASE WHEN t1m3 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3) THEN t2Score END)   AVG3
FROM
    T1
GROUP BY
    t1ID

Это работает, потому что все, что не соответствует условиям в выражении CASE, возвращает NULL, и все функции агрегирования, такие как AVG(), эффективно игнорируют NULL с.

0 голосов
/ 02 июля 2018

Вы можете использовать CTE для достижения результата. Как это-

WITH cte1 AS
(
    select t1ID ,AVG(t2score) AS AVG1
    from T1
    WHERE t1m1 NOT IN (t2m1,t2m2,t2m3) and t1m2 IN (t2m1,t2m2,t2m3)
    group by t1ID

 ),
 cte2 AS
 (
    select t1ID ,AVG(t2score) AS AVG2
    from T1
    WHERE t1m2 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)
    group by t1ID
 ),
 cte3 as
 (
     select t1ID ,AVG(t2score) AS AVGt3
     from T1
     WHERE t1m3 NOT IN (t2m1,t2m2,t2m3) and t1m1 IN (t2m1,t2m2,t2m3)
     group by t1ID
)
SELECT cte1.t1ID, cte1.AVG1, cte2.AVG2, cte3.AVG3
FROM cte1
JOIN cte2 ON cte1.t1ID = cte2.t1ID
JOIN cte3 ON cte2.t1ID = cte3.t1ID

Это подходит ТОЛЬКО , если столбец t1ID всегда возвращает все идентификаторы в каждом запросе.

Другими словами (по состоянию на MatBailie )

Это уместно, только если пункты WHERE в подзапросах никогда отфильтровать любое из обязательных t1ID значений.

0 голосов
/ 02 июля 2018

Создание временной таблицы и вставка в нее данных могут вам помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...