MySQL: как выбрать значение из одного уровня GROUP BY и транслировать на все уровни - PullRequest
1 голос
/ 05 июля 2019

У меня есть таблица MYSQL, как эта

person giftaid postcode year amount
A      1       NULL     2010     10
A      0       XY123    2010     15
A      0       NULL     2011     10
A      0       NULL     2011     20
B      0       NULL     2010     20
B      0       NULL     2010      1
B      0       NULL     2011     30
C      1       NULL     2010     50
C      1       AB345    2011     80

И я хочу суммировать суммы, указанные каждым человеком в каждом году, но принять значения подарка и почтового индекса для этого человека из любого года . То есть Мне нужно

person ever_giftaided any_postcode year sum
A      1              XY123        2010 25
A      1              XY123        2011 30
B      0              NULL         2010 21
B      0              NULL         2011 30
C      1              AB345        2010 50
C      1              AB345        2011 80

Обратите внимание, что, хотя человек А не согласился с подарком в 2011 году, потому что он согласился в 2010 году, я рад заполнить столбец ever_giftaided цифрой 1 за все годы и также принять любой ненулевой почтовый индекс .

Если я сделаю простой GROUP BY person, year и использую MAX(giftaid) AS ever_giftaided, MAX(postcode) AS any_postcode, то во втором ряду человек A получает 0 для ever_giftaided и NULL для any_postcode, потому что выражение group by не делает ' • Передача информации между группами по person, но по группам из комбинаций person и year. Я мог бы просто GROUP BY person, но тогда я не получаю суммы с разбивкой по годам. Так как я могу это сделать?

1 Ответ

1 голос
/ 05 июля 2019

Присоединяйтесь к двум запросам.Один группирует по person, другие - по person, year.

SELECT t1.person, t1.ever_giftaided, t1.any_postcode, t2.year, t2.sum
FROM (
    SELECT person, MAX(giftaided) AS ever_giftaided, MAX(postcode) AS any_postcode
    FROM yourTable
    GROUP BY person) AS t1
JOIN (
    SELECT person, year, SUM(amount) AS sum
    FROM yourTable
    GROUP BY person, year) AS t2 ON t1.person = t2.person

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

SELECT t1.person, MAX(giftaided) AS ever_giftaided, MAX(postcode) AS any_postcode,
         t2.year, t2.sum
FROM yourTable AS t1
JOIN (
    SELECT person, year, SUM(amount) AS sum
    FROM yourTable
    GROUP BY person, year) AS t2 ON t1.person = t2.person
GROUP BY t1.person
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...