基于1个值列和1个条件列

时间:2017-02-13 22:16:09

标签: mysql

HELP!

我似乎无法解决这个简单的MYSQL问题。

我在源表中有这种格式的数据:

Date_type        Date              Activity_id
Preferred        13/02/16 07:30    1
Planned          13/02/16 08:30    1
Actual           13/02/16 09:30    1
Preferred        14/02/16 07:30    2
Planned          14/02/16 08:30    2
Actual           14/02/16 09:30    2

我在报告中需要这样:

Activity_id  Preferred_Date    Planned_Date     Actual_DateDate              
1            13/02/16 07:30    13/02/16 08:30   13/02/16 09:30
2            14/02/16 07:30    14/02/16 08:30   14/02/16 09:30

我一直在谷歌搜索几个小时,我已经尝试了所有的变化如果/我知道的情况。我不知道如何转换它。谢谢你的帮助,伙计们,真的。

1 个答案:

答案 0 :(得分:2)

这是在MySQL中进行转移的好方法:

SELECT Activity,
  MAX(CASE `Type` WHEN 'Preferred' THEN `Value` END) AS Preferred_date,
  MAX(CASE `Type` WHEN 'Planned' THEN `Value` END) AS Planned_date,
  MAX(CASE `Type` WHEN 'Actual' THEN `Value` END) AS Actual_date
FROM MyTable
GROUP BY Activity;

我在后面标记TypeValue,因为它们是MySQL Reserved Words。通常我更喜欢避免使用保留字作为列名。

重新评论:

数据透视查询是指您的数据在行中,并且您希望将特定值格式化为列,通常取决于其他字段中的值。因此,例如,在您的情况下,您有不同类型值的数据行,并且您希望将时间戳值映射到由相应类型标记的列。这是行到列的轴。

MAX()或多或少是随意的,我也可以使用MIN()。它只是意味着我们将聚合函数应用于一组行,按活动的每个不同值进行分组。

CASE是SQL中的表达式。语法是相当不言自明的,但是如果没有大小写与数据匹配,则需要知道整个CASE表达式返回NULL。 MAX() / MIN()忽略NULL。因此,您应该为每组行中的每个类型获取一个不同的非NULL值。