【问题标题】:Column as row concatenated with another column列作为与另一列连接的行
【发布时间】:2016-09-28 12:18:27
【问题描述】:

所以我必须使用以时间为列的数据库(在特定日期每 10 分钟有一列),这里的 id 不是主键,即使它是唯一的(并且是主键) 在另一个表中。行数等于一天。 因此,我希望将每个时间段的值与它的日期时间放在一起。

这可能吗? 我可以编写一个小程序,用我需要的东西重新创建一个表,但我希望尽可能少地重复数据。

我有什么:

+---+----------+-----+-----+-----+-----+
|ID |   DATE   |00h00|00h10|00h20|00h30|
+---+----------+-----+-----+-----+-----+
|1  |2016-09-28|80   |79   |75   |73   |
+---+----------+-----+-----+-----+-----+
|1  |2016-09-27|82   |80   |76   |74   |
+---+----------+-----+-----+-----+-----+

我想要什么:

+---+----------------+-----+
|ID |        DATE    |VALUE|
+---+----------------+-----+
|1  |2016-09-28 00h00|80   |
|1  |2016-09-28 00h10|79   |
|1  |2016-09-28 00h20|75   |
|1  |2016-09-28 00h30|73   |
+---+----------------+-----+
|1  |2016-09-28 00h00|82   |
|1  |2016-09-28 00h10|80   |
|1  |2016-09-28 00h20|76   |
|1  |2016-09-28 00h30|74   |
+---+----------------+-----+

【问题讨论】:

    标签: mysql sql unpivot


    【解决方案1】:

    最简单的方法是使用union all

    select id, date_add(date, interval 0 minute) as date, `00h00` as value from t union all
    select id, date_add(date, interval 10 minute) as date, `00h10` as value from t union all
    . . .
    

    如果你有一个数字表,你也可以这样做:

    select t.id, date_add(date, interval (n.n - 1) * 10 minute) as date,
           (case when n = 1 then `00h00`
                 when n = 2 then `00h10`
                 . . .
            end) as value
    from t join
         numbers n
         on n.n < 24 * 6;
    

    如果不以某种方式列出所有列,我认为没有任何方法可以在 MySQL 中执行此操作。您可以使用其他查询或电子表格来生成 SQL。

    【讨论】:

    • 你是个天才!它有效,有点难看,因为它们是 24*6 列,但是谢谢!
    • 你的答案只是一个小错误,它是date_add()而不是dateadd(),顺便说一句,表格数字意味着00h0000h10 ...?
    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-12-26
    • 1970-01-01
    • 2019-06-01
    相关资源
    最近更新 更多