Запрос MYSQL для извлечения данных по группам

У меня есть следующие данные в таблице MySQL Tourament.

идентификатор имя команда 1 Уоррен А 2 Кэрол Б 3 Донна 4 Уильям А 5 Андрей С 6 Нил А 7 Макс А 8 Фил 9 Уильям 10 Кит 11 Фил

Я пытаюсь создать запрос для вывода данных в следующей форме для их дальнейшей обработки.

имя команда А 1 Б 1 С 1 Донна 0 Кит 0 Фил 0 Фил 0 Уильям 0

Пожалуйста, посмотрите здесь для получения данных.

Текущая попытка:

select COALESCE(NULLIF(`team`,''), `name`) as name, 
case
    when `team` = '' THEN false
    when `team` != '' THEN true
end as `group`
from `tournament` order by COALESCE(NULLIF(`team`, ''), `name`) ASC;

Я не понимаю, как вы получаете от своей таблицы tournament желаемый результат. Вы можете объяснить?

JNevill 19.06.2024 15:51

@JNeville Пожалуйста, посмотрите sqlfiddle для получения данных

neeraj 19.06.2024 15:54

Я добавил вашу текущую попытку к вопросу, чтобы обеспечить контекст. Объяснение все равно было бы полезно.

JNevill 19.06.2024 15:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваша попытка хороша, вам просто нужно переписать COALESCE(NULLIF(team,''), name) на COALESCE(team, name), потому что COALESCE перейдет к следующему параметру только в том случае, если текущий параметр равен NULL. Поскольку'' != NULL столбец name никогда не будет выбран.

Что-то вроде:

SELECT COALESCE(team, name) as name, 
   CASE when team IS NULL THEN 0 ELSE 1 END as group 
FROM tournament 
ORDER BY COALESCE(team, name);

Спасибо @JNeville за это разъяснение, однако оно не дает желаемого результата.

neeraj 19.06.2024 16:13

Вероятно, вам просто нужен DISTINCT или GROUP BY для агрегирования записей, и вы должны быть примерно готовы.

JNevill 19.06.2024 16:29

Можете ли вы привести пример?

neeraj 19.06.2024 16:42

Просто вставь слово DISTINCT после слова SELECT и давай копать

JNevill 19.06.2024 16:45
Ответ принят как подходящий

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

SELECT 
    team AS name, 
    case
        when `team` = '' THEN false
        when `team` != '' THEN true
    end as `group` 
FROM tournament 
WHERE team IS NOT NULL AND team != '' 
GROUP BY team 
UNION ALL 
SELECT name, 0 AS team 
FROM tournament 
WHERE team IS NULL OR team = ''
ORDER BY name;

Спасибо @Kousalya N за ответ! Решение действительно дает желаемый результат.

neeraj 19.06.2024 17:02

Это работает и без такого объединения

SELECT 
    MAX(name) AS name,
    IF(team = '',0,1) as team
FROM tournament 
GROUP BY team,name
ORDER BY IF(team = '',1,0),name ASC;

результат:

name    team
Andrew  1
Carol   1
Max     1
Neil    1
Warren  1
William 1
Donna   0
Keith   0
Phil    0
William 0

нажмите здесь, чтобы увидеть образец

Другие вопросы по теме