救命啊!
我似乎无法解决这个简单的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
我已经在谷歌上搜索了几个小时了,我已经尝试了所有我知道的Select if/case变体。我看不出我怎么能改变这一点。谢谢你们的帮助,伙计们,真的。
最佳答案
这是在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;
我在back ticks中分隔了
Type
和Value
,因为它们是MySQL Reserved Words。通常我喜欢避免使用保留字作为列名。回复您的评论:
数据透视查询是指当数据在行中并且希望将特定值格式化为列时,通常取决于另一个字段中的值。例如,在您的例子中,您有不同类型值的数据行,并且您希望将时间戳值映射到由相应类型标记的列中。这是行到列的轴。
MAX()
或多或少是任意的,我也可以使用MIN()
。它只是意味着我们将一个聚合函数应用于一组行,按活动的每个不同值进行分组。CASE
是SQL中的一个表达式。语法相当简单,但您需要知道,如果没有大小写与数据匹配,则整个CASE
表达式将返回NULL。忽略空值。因此,对于每一组行中的每种类型,您应该只获得一个不同的非空值。关于mysql - 基于1个值列和1个条件列创建列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42214536/