простой sql: как сгруппировать в отдельные столбцы? - PullRequest
1 голос
/ 12 февраля 2012

Скажем, я держу цены на акции в таблице из 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 ]

3 голосов
/ 12 февраля 2012

Независимо от базы данных, которую вы используете, концепция того, что вы пытаетесь достичь, называется «сводная таблица».

Вот пример для mysql: http://en.wikibooks.org/wiki/MySQL/Pivot_table

Некоторые базы данных имеют встроенные функции для этого, см. Ссылки ниже.

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

Oracle: http://www.dba -oracle.com / t_pivot_examples.htm

Вы всегда можете создать пивот вручную. Просто выберите все агрегаты в наборе результатов, а затем выберите из этого набора результатов.

Обратите внимание, что в вашем случае вы можете поместить все имена в один столбец, используя concat (я думаю, что это group_concat в mysql), так как вы не можете знать, сколько имен связано с ticker.

2 голосов
/ 12 февраля 2012

Как это:

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

1 голос
/ 12 февраля 2012

Да, если вы не используете расширения базы данных SQL для поворота. Вот как вы это делаете в Microsoft SQL Server.

...