SQL将聚合值转换为单个列

SQL将聚合值转换为单个列,sql,oracle,oracle11g,transform,transpose,Sql,Oracle,Oracle11g,Transform,Transpose,因此,目前我对数据进行了如下规范化: +----------+-------+-------+ | day | color | value | +----------+-------+-------+ | 1/1/2016 | red | 1 | +----------+-------+-------+ | 1/1/2016 | blue | 2 | +----------+-------+-------+ | 1/1/2016 | green | 3 |

因此,目前我对数据进行了如下规范化:

+----------+-------+-------+
| 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; 

希望我正确地理解了你的问题

我想下面的问题会对你有所帮助

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; 

最好使用
MAX()
而不是
SUM()对不起,如果我弄错了,就用max替换sum。我已经更新了查询。最好使用
max()
,而不是
sum()
,以防他的实际数据集中有
NULL
值。啊,谢谢,我相信这个答案就是我要找的,但是像蒂姆说的那样使用max()对不起,如果我搞错了,请用max替换sum。我已经更新了查询。