2017-02-14 29 views
0

所以我有数据标准化这样目前:SQL变换合计值到各个列

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

所以我的问题是,是否有一个更容易或不那么罗嗦的方式来做到这一点在甲骨文?对于这样一个简单的任务似乎有点愚蠢!另外,这可能不是很有效。

回答

2

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

我觉得下面的查询会帮助你。

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

如果他的实际数据集中包含“NULL”值,则最好使用比MAX()更多的'MAX()'。 –

+0

啊谢谢,我相信这个答案是我正在寻找的,但是像MAX()这样的tim说道。 :) – barker

+0

对不起,如果我错了,只需用max取代sum。我已更新查询。 – Tajinder