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
我一直在谷歌搜索几个小时,我已经尝试了所有的变化如果/我知道的情况。我不知道如何转换它。谢谢你的帮助,伙计们,真的。
答案 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;
我在后面标记Type
和Value
,因为它们是MySQL Reserved Words。通常我更喜欢避免使用保留字作为列名。
重新评论:
数据透视查询是指您的数据在行中,并且您希望将特定值格式化为列,通常取决于其他字段中的值。因此,例如,在您的情况下,您有不同类型值的数据行,并且您希望将时间戳值映射到由相应类型标记的列。这是行到列的轴。
MAX()
或多或少是随意的,我也可以使用MIN()
。它只是意味着我们将聚合函数应用于一组行,按活动的每个不同值进行分组。
CASE
是SQL中的表达式。语法是相当不言自明的,但是如果没有大小写与数据匹配,则需要知道整个CASE
表达式返回NULL。 MAX()
/ MIN()
忽略NULL。因此,您应该为每组行中的每个类型获取一个不同的非NULL值。