Как объединить до sql столбцов разной длины? - PullRequest
1 голос
/ 06 мая 2020

У меня есть два SQL запроса, которые при запуске первый формирует это:

SELECT c.cid, title, name, weighting, mark 
FROM Grade g 
 JOIN Assessment a ON g.aid = a.aid 
 JOIN Course c ON a.cid = c.cid 
WHERE sid = 'S0001'; 
+--------------------------------------------+
-cid --- table - name - weighting - mark 
-c1 ----OOP---A1--------20--------50--
-c1 ----OOP---A2--------20--------50--
-c1 ----OOP---A3--------20--------50--
-c1 ----OOP---A4--------20--------50--
-c1 ----OOP---A5--------20--------50--
-c2 ----OOP---A1--------20--------72--
-c2 ----OOP---A2--------20--------65--
-c2 ----OOP---EX--------20--------50--
-c3 ----OOP---A1--------20--------50--
-c3 ----OOP---A2--------20--------72--
-c3 ----OOP---A3--------20--------65--
-c3 ----OOP---EX--------20--------65--
+--------------------------------------------+

, а второй формирует это:

SELECT cid, SUM(mark*weighting)/100 AS Final 
FROM Grade g 
  JOIN Assessment a ON g.aid = a.aid 
WHERE sid = 'S0001' 
GROUP BY cid;
+--------------+
-cid----final 
-c1 ----60---
-c2 ----65---
-c3 ----65---
+--------------+

Как Могу ли я объединить два запроса, чтобы добавить последний столбец к исходному, и он будет выглядеть так?

+--------------------------------------------+
-cid --- table - name - weighting - mark - final
-c1 ----OOP---A1--------20--------50--------60
-c1 ----OOP---A2--------20--------50--
-c1 ----OOP---A3--------20--------50--
-c1 ----OOP---A4--------20--------50--
-c1 ----OOP---A5--------20--------50--
-c2 ----OOP---A1--------20--------72--------65
-c2 ----OOP---A2--------20--------65--
-c2 ----OOP---EX--------20--------50--
-c3 ----OOP---A1--------20--------50--------70
-c3 ----OOP---A2--------20--------72--
-c3 ----OOP---A3--------20--------65--
-c3 ----OOP---EX--------20--------65--

Я пробовал множество вещей, но на самом деле ничего не работает, любая помощь буду очень признателен. Заранее спасибо! (Последний столбец не соответствует ни одному из других столбцов, кроме cid).

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Если вы используете MySQL 8.0, вы можете использовать оконные функции:

SELECT 
    c.cid, 
    title, 
    name, 
    weighting, 
    mark,
    SUM(mark*weighting) OVER(PARTITION BY c.cid) final
FROM Grade g 
JOIN Assessment a ON g.aid = a.aid 
JOIN Course c ON a.cid = c.cid 
WHERE sid = 'S0001';

Или, если вам просто нужен final для «верхней» строки для каждой группы:

SELECT 
    c.cid, 
    title, 
    name, 
    weighting, 
    mark,
    CASE WHEN ROW_NUMBER() OVER(PARTITIN BY c.cid ORDER BY name) = 1 
        THEN SUM(mark*weighting) OVER(PARTITION BY c.cid)
    END final
FROM Grade g 
JOIN Assessment a ON g.aid = a.aid 
JOIN Course c ON a.cid = c.cid 
WHERE sid = 'S0001'
ORDER BY cid, name

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

В более ранних версиях вы можете присоединиться к агрегатному запросу или использовать коррелированный подзапрос:

SELECT 
    c.cid, 
    title, 
    name, 
    weighting, 
    mark,
    x.final
FROM Grade g 
JOIN Assessment a ON g.aid = a.aid 
JOIN Course c ON a.cid = c.cid 
JOIN (
    SELECT cid, SUM(mark*weighting)/100 AS Final 
    FROM Grade g 
    JOIN Assessment a ON g.aid = a.aid 
    WHERE sid = 'S0001' 
    GROUP BY cid
) x ON x.cid = c.cid
WHERE sid = 'S0001'
0 голосов
/ 06 мая 2020
select cid,title,name,weighting, case when top = 1 then final end as final
from (
       select a.cid as cid,title,name,weighting,b.Final as Final , 
       row_number() over(partition by a.cid order name ) as top
       from
           (SELECT c.cid, title, name, weighting, mark 
            FROM Grade g 
            JOIN Assessment a ON g.aid = a.aid 
            JOIN Course c ON a.cid = c.cid 
             WHERE sid = 'S0001'
           ) A,
          (SELECT cid, SUM(mark*weighting)/100 AS Final 
           FROM Grade g 
           JOIN Assessment a ON g.aid = a.aid 
           WHERE sid = 'S0001' 
           GROUP BY cid
          )B
where a.cid = b.cid
)
0 голосов
/ 06 мая 2020
SELECT c.cid,
       title,
       name,
       weighting,
       mark,
       SUM(mark*weighting)/100 AS FINAL
FROM Grade g
JOIN Assessment a ON g.aid = a.aid
JOIN Course c ON a.cid = c.cid
HAVING sid = 'S0001';

Попробуйте! Это может вам помочь?
Поскольку SUM является агрегатной функцией в SQL, использование HAVING вместо WHERE приведет к тренировке.

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