【发布时间】:2011-09-30 03:23:08
【问题描述】:
我有一个表格,其中包含要导出到 CSV 的数据。理想情况下,我想切换行和列,以便更好地分组数据。
为了进一步解释,目前,数据库看起来像这样..
data_id data_timestamp data_value
--------------------------------------------
1 2011-07-07 00:01:00 0.400
1 2011-07-07 00:02:00 0.500
1 2011-07-07 00:03:00 0.600
1 2011-07-07 00:04:00 0.700
2 2011-07-07 00:01:00 0.100
2 2011-07-07 00:02:00 0.200
2 2011-07-07 00:03:00 0.250
2 2011-07-07 00:04:00 2.300
我想通过 data_timestamp 值对 data_value 进行分组,以便对时间戳进行分组,并且每个 data_id 的每个 data_value 都显示在一列中,而不是一行。
data_timestamp input_1 input_2
--------------------------------------------
2011-07-07 00:01:00 0.400 0.100
2011-07-07 00:02:00 0.500 0.200
2011-07-07 00:03:00 0.600 0.250
2011-07-07 00:04:00 0.700 2.300
下面是我正在使用的查询...
SELECT d.data_timestamp, d.input_1, d.input_2
FROM (
SELECT data_timestamp,
IF(data_id=1,data_value,NULL) AS 'input_1',
IF(data_id=2,data_value,NULL) AS 'input_2' FROM data
) AS d ORDER BY data_timestamp ASC
但这并不是我想要的,因为现在只要一个 data_id 没有值,就会有 NULL 值。 GROUP BY 似乎也对 data_value 进行了分组,这不是我想要的。
有什么建议吗?
编辑:
我已经尝试在外部查询中使用 WHERE d.input_1 IS NOT NULL,但不能完全得到结果..
在 WHERE 之前...
data_timestamp input_1 input_2
--------------------------------------------
2011-07-07 00:01:00 0.400 NULL
2011-07-07 00:01:00 NULL 0.100
2011-07-07 00:02:00 0.500 NULL
2011-07-07 00:02:00 NULL 0.200
2011-07-07 00:03:00 0.600 NULL
2011-07-07 00:03:00 NULL 0.250
2011-07-07 00:04:00 0.700 NULL
2011-07-07 00:04:00 NULL 2.300
添加 WHERE d.input_1 IS NOT NULL 将删除 input_2 值..
data_timestamp input_1 input_2
--------------------------------------------
2011-07-07 00:01:00 0.400 NULL
2011-07-07 00:02:00 0.500 NULL
2011-07-07 00:03:00 0.600 NULL
2011-07-07 00:04:00 0.700 NULL
另外,实际上,我有大约 20 个 id 可以分组,所以对它们来说也不是最好的主意..
【问题讨论】:
-
为什么不在外部查询中添加
WHERE子句来过滤NULL值? -
@Michael,我确实有一个 WHERE d.input_1 IS NOT NULL,它适用于第一个 id,但不适用于第二个。我已经编辑它来说明..
-
那为什么不加
AND d.input_2 IS NOT NULL呢? -
我试过了,但是根本不返回任何结果,因为当 input_1 和 input_2 都为 NULL 时不会发生。一个总是有一个值,当另一个是 NULL...
-
那么你可以使用
IF来选择不为空的值。