简单的sql:如何分组成单独的列?

时间:2012-02-12 12:33:15

标签: sql transform pivot pivot-without-aggregate

假设我将股票价格保存在3列表中,如下所示:

create table stocks(
    ticker text,
    day int,
    price int
);

insert into stocks values ('aapl', 1, 100);
insert into stocks values ('aapl', 2, 104);
insert into stocks values ('aapl', 3, 98);
insert into stocks values ('aapl', 4, 99);

insert into stocks values ('goog', 1, 401);
insert into stocks values ('goog', 2, 390);
insert into stocks values ('goog', 3, 234);

我希望结果看起来像:

day aapl goog
1   100  401
2   104  390
3   98   234
4   99   null

我真的需要选择两次,每个自动收报机一次,然后外部加入结果吗?

3 个答案:

答案 0 :(得分:3)

无论您使用何种数据库,您尝试实现的概念都称为“数据透视表”。

这是mysql的一个例子: http://en.wikibooks.org/wiki/MySQL/Pivot_table

有些数据库具有内置功能,请参阅下面的链接。

SQLServer的: http://msdn.microsoft.com/de-de/library/ms177410.aspx

甲骨文: http://www.dba-oracle.com/t_pivot_examples.htm

您始终可以手动创建枢轴。只需选择结果集中的所有聚合,然后从该结果集中进行选择。

注意,在您的情况下,您可以使用concat将所有名称放入一列(我认为这是mysql中的group_concat),因为您无法知道有多少名称与ticker相关。

答案 1 :(得分:2)

像这样:

Select day,
   MAX(case WHEN ticker = 'aapl' then price end) as 'aapl',
   MAX(case WHEN ticker = 'goog' then price end) as 'goog'
From stocks
group by day

DEMO

答案 2 :(得分:1)

是的,除非您的数据库具有用于数据透视的SQL扩展。 Here's how you do it in Microsoft SQL Server.