Преобразовать строку в столбец MySQL с идентификатором (без поворота)

#mysql #row #multiple-columns

#mysql #строка #несколько столбцов

Вопрос:

У меня есть хранилище значений в базе данных, подобное этому:

 ID     |   Date    |   Value
----------------------------------------------
1      |   11/20   |   1
1      |   11/21   |   2
2      |   11/20   |   10 
2      |   11/21   |   20
  

Однако мне нужно, чтобы это было так:

  Date  | Value ID 1    |   Value ID 2
----------------------------------------------
  11/20|  1            |   10
  11/21|  2            |   20
  

Таким образом, новый столбец может быть построен в тренде (столбец 1 = дата, столбец 2 = значение # 1, столбец 3 = значение # 2, столбец 4 = значение # 4 и т. Д.).


Вот запрос для одного тега:

 SELECT *
FROM (
SELECT ID, _date, ESYNC_TAGSHISTORY.Val,  @curRow := @curRow   1 AS row_number
FROM ESYNC_TAGSHISTORY
JOIN (SELECT @curRow:=0) i
INNER JOIN ESYNC_TAGS ON ESYNC_TAGSHISTORY.TAGID=ESYNC_TAGS.ID
WHERE ESYNC_TAGS.NAME='I_TT_21052'  AND ESYNC_TAGS.STATIONID=1 AND (_date BETWEEN now()-INTERVAL 45 MINUTE AND now()) ) s
WHERE row_number mod 60 = 0;
  

И результаты:

  ID  | Date  | Value ID 1   |   Row
----------------------------------------------
  1  |  11/20|  1           |   1
  1  |  11/21|  2           |   2
  

Редактировать :

С некоторыми изменениями мой запрос выглядит следующим образом

 SELECT *
            FROM (
            SELECT ID,  _date, ESYNC_TAGSHISTORY.Val,  @curRow := @curRow   1 AS row_number,
            if (ESYNC_TAGS.NAME='I_TT_21052', ESYNC_TAGSHISTORY.Val, NULL) as 'I_TT_21052',
            if (ESYNC_TAGS.NAME='I_TT_91214', ESYNC_TAGSHISTORY.Val, NULL) as 'I_TT_40011'
            FROM ESYNC_TAGSHISTORY
            JOIN (SELECT @curRow:=0) i
            INNER JOIN ESYNC_TAGS ON ESYNC_TAGSHISTORY.TAGID=ESYNC_TAGS.ID
            WHERE ESYNC_TAGS.STATIONID=1 AND (_date BETWEEN now()-INTERVAL 5 MINUTE AND now()) ) s
            WHERE row_number mod 1 = 0
            ORDER BY ID ,_date;
  

Результат выглядит следующим образом

РЕЗУЛЬТАТ SQL

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

РЕДАКТИРОВАТЬ # 2: наконец, для дальнейшего справочного запроса выглядит следующим образом :

 SELECT _date, I_TT_21052, I_TT_40011, row_number
            From(
            SELECT max(_date) as _date, max(I_TT_21052) as I_TT_21052, max(I_TT_40011) as I_TT_40011, @curRow := @curRow   1 AS row_number

                                FROM (
                                SELECT ID,  _date, ESYNC_TAGSHISTORY.Val,
                                if (ESYNC_TAGS.NAME='I_TT_21052', ESYNC_TAGSHISTORY.Val, NULL) as 'I_TT_21052',
                                if (ESYNC_TAGS.NAME='I_TT_91214', ESYNC_TAGSHISTORY.Val, NULL) as 'I_TT_40011'
                                FROM ESYNC_TAGSHISTORY
                                JOIN (SELECT @curRow:=0) i
                                INNER JOIN ESYNC_TAGS ON ESYNC_TAGSHISTORY.TAGID=ESYNC_TAGS.ID
                                WHERE ESYNC_TAGS.STATIONID=1 AND (_date BETWEEN now()-INTERVAL 24 HOUR AND now()) ) s

            GROUP BY _date)v
            WHERE row_number mod 150 = 0;
  

Ответ №1:

 select 
case when id=1 then count(Id) else 0 end) as Value1,
case when id=2 then count(Id) else 0 end) as Value2
from ESYNC_TAGSHISTORY
  

Это не точно, но попробуйте такой запрос, и вы получите результат