Member 14852988 Ответов: 2

Динамический перенос таблицы


Привет,

У меня есть uestion относительно моего SQL-кода.
Моя цель-это переключение строк в столбцы.
ID | NAME | POINTS| DATE
-----------------------------------
1 | KARL | 2 | 2020-05-15
2 | EVA | 0 | 2020-05-15
3 | OTTO | 5 | 2020-05-15
4 | KARL | 3 | 2020-05-16
5 | EVA | 1 | 2020-05-16
6 | OTTO | 7 | 2020-05-16
7 | KARL | 5 | 2020-05-17
8 | EVA | 3 | 2020-05-17
9 | OTTO | 10 | 2020-05-17


Goal:
Name|POINTS|2020-05-15|2020-05-16|2020-05-17
----------------------------------------------------------
KARL|2|3|5
EVA|0|1|3
OTTO|5|7|10

My Code
SELECT
    myname,
    SUBSTRING_INDEX(group_concat(concat(`points`) separator '|'), '|', 1) AS firstday,
    SUBSTRING_INDEX(SUBSTRING_INDEX(group_concat(concat(`points`) separator '|'), '|', 2), '|', -1)  as secondday,  
    SUBSTRING_INDEX(SUBSTRING_INDEX(group_concat(concat(`points`) separator '|'), '|', 3), '|', -1) AS lastday
FROM
    (select * from mytable where mydate >= '2020-05-15' order by myname, mydate) tmp
group by myname


Это работает, я думаю, с этим кодом.
Я хочу добавить новый colum в таблицу, например команды

ID | ИМЯ | КОМАНДА |ОЧКИ| ДАТА
-----------------------------------
1 | КАРЛ | TEAM1 | 2 | 2020-05-15
2 | EVA | TEAM2 | 0 | 2020-05-15
3 | OTTO | TEAM3 | 5 | 2020-05-15
4 | КАРЛ | TEAM1 | 3 | 2020-05-16
5 | EVA | TEAM2 | 1 | 2020-05-16
6 | OTTO | TEAM3 | 7 | 2020-05-16
7 | КАРЛ | TEAM2 | 5 | 2020-05-17
8 | EVA | TEAM2 | 3 | 2020-05-17
9 | OTTO | TEAM3 | 10 | 2020-05-17

Таким образом, результат должен выглядеть следующим образом
Имя|команда||очки|2020-05-15|2020-05-16|2020-05-17
----------------------------------------------------------
КАРЛ|TEAM2|2|3|5
ЕВА|TEAM2|0|1|3
ОТТО|TEAM3|5|7|10

С моим кодом этот сопляк работает правильно. Смена команд приводит к тому, что новая команда не появляется и очки не правильно подобраны.
Он выбирает последние 3 значения для точек, но помещает текущее значение для точек на ту дату, когда было сделано изменение.

Подобный этому
Name|TEAM||POINTS|2020-05-15|2020-05-16|2020-05-17
----------------------------------------------------------
KARL|TEAM2|5|3|5


I hope I explained it correct.

I try to have a flexible selection so that changes of the team won't disturb the display of the points.

Thank you very much

With kind regards

Tobi

What I have tried:

Checked manuel for stored procedures

Garth J Lancaster

Я думаю, вам нужно немного улучшить свой вопрос - например, почему TEAM2 является командой для Карла здесь "KARL|TEAM2|2|3|5-что ? - о'Кей, похоже, это последняя команда, в которой Карл был по дате или максимум по дате ..

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

кстати, ВТФ это transponation' ? может быть, вы имеете в виду "транспозицию"?

2 Ответов

Рейтинг:
12

#realJSOP

То, что вы хотите сделать, это выполнить "поворот" на вашем столе. Если вы делаете это в представлении сервера MySQL или сохраненном proc, SQL Pivot во всех базах данных: MySQL, MariaDB, SQLite, PostgreSQL, Oracle, …[^]


Maciej Los

5ed!

Рейтинг:
11

Member 14852988

Привет,

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

SELECT id, name, team, 
                                MAX(CASE WHEN datum = DATE_SUB(CURDATE(), INTERVAL 4 day) THEN points END) 4tage, 
                                MAX(CASE WHEN datum = DATE_SUB(CURDATE(), INTERVAL 3 day) THEN points END) 3tage, 
                                MAX(CASE WHEN datum = DATE_SUB(CURDATE(), INTERVAL 2 day) THEN points END) 2tage, 
                                MAX(CASE WHEN datum = DATE_SUB(CURDATE(), INTERVAL 1 day) THEN ppoints END) 1tage,
                                MAX(CASE WHEN datum = DATE_SUB(CURDATE(), INTERVAL 0 day) THEN points END) 0tage 
                                FROM `vs_highscore` WHERE datum BETWEEN DATE_SUB(NOW() , INTERVAL 5 day) AND NOW() 
                                GROUP BY name, team ORDER BY team DESC


Это не идеально, но для меня это нормально.

Возможно, эксперты подскажут мне, что нужно улучшить.

Я нашел решение с помощью ссылки
#realJSOP
опубликованный.
Чем ты за это.

С наилучшими пожеланиями

Тоби


Maciej Los

Итак, #realJSOP заслуживает 5 баллов. Вы также должны принять его решение (используйте зеленую кнопку). Вы также можете принять свое собственное решение в качестве ответа.
;)
Кстати: есть 5!