按列分组跨列

时间:2015-06-24 09:05:42

标签: mysql sql group-by grouping

我有一个包含以下列的表

timetrack_id | timetrack_length | timetrack_rate | timetrack_parent

如果时间跟踪已经继续,timetrack_parent会保留timetrack_id,但如果时间跟踪没有,则会0

我想为每个timetrack_id拉回一行,但将timetrack_length合并到timetrack_parent = timetrack_id。然后其余的值应该来自父行(其中timetrack_parent = 0,行存在时timetrack_parent为此timetrack_id)。

所以对于以下数据

timetrack_id | timetrack_length | timetrack_rate | timetrack_parent
-------------+------------------+----------------+-------------------
1            | 5                | 20.00          | 0
2            | 7                | 20.00          | 0
3            | 8                | 20.00          | 0
4            | 20               | 20.00          | 1
5            | 15               | 25.00          | 1
6            | 6                | 30.00          | 3

我会回来

1 | 40 | 20.00 | 0
2 | 7  | 20.00 | 0
3 | 14 | 20.00 | 0

我有以下查询

SELECT `timetrack_id`, `timetrack_parent`, `timetrack_rate`, SUM(`timetrack_length`) 
FROM `timetrack` 
GROUP BY `timetrack_parent`, `timetrack_parent` = `timetrack_id`

这会按timetrack_parentSUM timetrack_length对行进行分组,但这也会将timetrack_parent为0的行分组,这些行不相关。此查询也不会将timetrack_parent = timetrack_id放在哪里。我也不确定是否总会返回 parent 行中的其他数据。

所以返回的是

1 | 20 | 20.00 | 0
4 | 35 | 20.00 | 1
6 | 6  | 30.00 | 3

有人可以提供一些方向吗?

1 个答案:

答案 0 :(得分:1)

我认为这个查询应该有效。您需要将表连接到自身以获取父/子分组和&然后添加所有父行(timetrack_parent = 0) 然后进行分组。

SELECT id1 timetrack_id, sum(len) sumlength, timetrack_rate, timetrack_parent FROM
(
SELECT a.timetrack_id id1, b.* FROM timetrack a
JOIN timetrack b ON a.timetrack_id=b.timetrack_parent
UNION ALL
SELECT c.timetrack_id, c.* FROM timetrack c
WHERE c.timetrack_parent=0
ORDER BY 4
) z
GROUP BY 1