【问题标题】:Convert Row to Column mySQL with ID (not pivoting)使用 ID 将行转换为列 mySQL(不旋转)
【发布时间】:2016-10-12 20:23:10
【问题描述】:

我在这样的数据库中有一个值存储:

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 RESULT

我现在的问题是将数据从最后一列移到与另一列相同的位置(使值与日期对齐)

编辑#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;

【问题讨论】:

    标签: mysql row multiple-columns


    【解决方案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
    

    这并不准确,但尝试这种查询你会得到结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-16
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多