SQL 将聚合值转换为单独的列

SQL transform aggregate values into individual columns

所以我目前已经像这样规范化了数据:

+----------+-------+-------+
| day      | color | value |
+----------+-------+-------+
| 1/1/2016 | red   | 1     |
+----------+-------+-------+
| 1/1/2016 | blue  | 2     |
+----------+-------+-------+
| 1/1/2016 | green | 3     |
+----------+-------+-------+
| 1/2/2016 | red   | 4     |
+----------+-------+-------+
| 1/2/2016 | blue  | 5     |
+----------+-------+-------+
| 1/2/2016 | green | 6     |
+----------+-------+-------+  

我想将其转换为此布局以供报告:

+----------+-----+------+-------+
| day      | red | blue | green |
+----------+-----+------+-------+
| 1/1/2016 | 1   | 2    | 3     |
+----------+-----+------+-------+
| 1/2/2016 | 4   | 5    | 6     |
+----------+-----+------+-------+  

我用来执行此操作的代码是:

with
red as (
    select
    day
    ,value as red
    from mytable
    where color='red'
),

blue as (
    select
    day
    ,value as blue
    from mytable
    where color='blue'
),

green as (
    select
    day
    ,value as green
    from mytable
    where color='green'
)

select
red.*
,blue.blue
,green.green
from red red
inner join blue blue
on red.day=blue.day
inner join green green
on red.day=green.day  

所以我的问题是,在 Oracle 中是否有更简单或更简洁的方法来执行此操作?这么简单的任务似乎有点傻!另外,它可能不是很有效。

希望我正确理解你的问题。

我认为下面的查询会对您有所帮助。

select day_col,
max(case when color = 'red' then value_col end) red_color,
max(case when color = 'blue' then value_col end) blue_color,
max(case when color = 'green' then value_col end) green_color
from your_table 
group by day_col;