Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Результат в одну колонку / 13 сообщений из 13, страница 1 из 1
13.05.2007, 13:00
    #34521599
_Chester
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Помогите плз. с запросом:

Ест 2 таблицы Отделы, Сотруники, нужно выбрать сотрудников из всех отделов, и представить результат в виде:

Код: plaintext
1.
2.
3.
4.
Отдел             |Персонал
-------------------------------------
ПРОГРАМЕРЫ        |  ВАСЯ, ПЕТЯ, КОЛЯ
АДМИНЫ            |  САША, ДИМА
ДИЗАЙНЕРЫ         |  ОЛЕГ, ФЕДЯ





...She gave me something, it was a mushroom...
...
Рейтинг: 0 / 0
13.05.2007, 18:55
    #34521866
domanix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Сколько людей - столько мнений.
Лично я использую самый простой способ ( imho) :
создать агрегатную функцию- которая аккумулирует в массив все значения при группировке.
Пример :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
--создадим тестовые данные
create table agg_test (otdel text,      empl text);
insert into agg_test values('ПРОГРАМЕРЫ','Паша');
insert into agg_test values('ПРОГРАМЕРЫ','Петя');
insert into agg_test values('ПРОГРАМЕРЫ','Полина');
insert into agg_test values('АДМИНЫ ',     'Игорь');
insert into agg_test values('АДМИНЫ ',     'Иван');
insert into agg_test values('ДИЗАЙНЕРЫ ','Модест');
insert into agg_test values('ДИЗАЙНЕРЫ ','Михаил');
-- Создадим аггрегатную функцию 
CREATE AGGREGATE array_accum (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);
-- Пример использования
select  otdel, array_accum(empl) from agg_test group by otdel;

-- результат:
otdel	   |   array_accum
-------------------------------
ПРОГРАМЕРЫ | {Паша,Петя,Полина}
АДМИНЫ	   | {Игорь,Иван}
ДИЗАЙНЕРЫ  | {Модест,Михаил}

-- В вышеприведенном примере  одно из результирующих полей вернется в виде массива.
-- Если по каким либо причинам, нет желания возиться на клиенте с массивами, то 
-- это поле можно легко конвертнуть в строку(text)  функцией array_to_string, в которой,
-- кроме всего прочего, можно задать и разделитель 
-- к примеру :
select    otdel, array_to_string(array_accum(empl),';') from agg_test group by otdel
--результат:
otdel 		| array_to_string
-------------------------------
ПРОГРАМЕРЫ  | Паша;Петя;Полина
АДМИНЫ      | Игорь;Иван
ДИЗАЙНЕРЫ   | Модест;Михаил
...
Рейтинг: 0 / 0
17.05.2007, 06:53
    #34531041
ShadyAngel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Зверски... А для подобной цели хранимку писал, на 15 строк.
Большое спасибо :)
...
Рейтинг: 0 / 0
18.05.2007, 16:11
    #34536284
_Chester
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Спасибо всем.

В принципе удовлетворило и простое использование стандартной постгресовой фичи ARRAY(select * from ...)

Однако увы, должной гибкости тут нет. На форме MySQL встречается упоминание о ф-ции GROUP_CONCAT, но опять таки - это только в MySQL.



...She gave me something, it was a mushroom...
...
Рейтинг: 0 / 0
18.05.2007, 16:38
    #34536368
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
_ChesterСпасибо всем.

В принципе удовлетворило и простое использование стандартной постгресовой фичи ARRAY(select * from ...)

Однако увы, должной гибкости тут нет. На форме MySQL встречается упоминание о ф-ции GROUP_CONCAT, но опять таки - это только в MySQL.

...She gave me something, it was a mushroom...
А че воспользоваться советом domanix не получается? ИМХО самое мощное, гибкое и красивое решение. Если тяжело напрямую воспользоваться - спрашивайте, поможем.

ЗЫ Упоминание в MySQL еще не значит что оно там есть
...
Рейтинг: 0 / 0
21.05.2007, 05:20
    #34538586
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Andrey DaeronЗЫ Упоминание в MySQL еще не значит что оно там есть Оно там не только есть, но ещё и работает! Правда лишь начиная с версии 4.1 (если мне память не изменяет)...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
11.07.2008, 15:28
    #35425840
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Спасибо, deomanix!

Теперь только вопрос - то же самое сделать, если вместо "Пети", "Васи" и "Коли" в agg_test хранятся их ключи, но вывести все-таки нужно по именам.
...
Рейтинг: 0 / 0
11.07.2008, 15:39
    #35425885
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Robert AyrapetyanСпасибо, deomanix!

Теперь только вопрос - то же самое сделать, если вместо "Пети", "Васи" и "Коли" в agg_test хранятся их ключи, но вывести все-таки нужно по именам.Сделать запрос из двух таблиц. Связать их по ключам. А в аггрегатную функцию пихануть поле из таблицы, где хранятся имена.
...
Рейтинг: 0 / 0
11.07.2008, 15:55
    #35425928
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
вернее, не так выразился... можно ли сгруппировать, если в программерах два пети
...
Рейтинг: 0 / 0
11.07.2008, 17:15
    #35426161
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Нашел решение.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DROP AGGREGATE IF EXISTS array_accum(anyelement);

CREATE OR REPLACE FUNCTION array_unique (ANYARRAY)
RETURNS ANYARRAY
LANGUAGE SQL
AS '
SELECT ARRAY(
    SELECT DISTINCT $1[s.i] AS "foo"
    FROM
        generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
);
';

CREATE AGGREGATE array_accum (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}',
    finalfunc = array_unique
);
...
Рейтинг: 0 / 0
15.07.2008, 16:13
    #35431584
Antoxa1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Хоть автор вроде и нашел решение, думаю такой вариант то же кому нибудь пригодится...
//-------------------------------------------------
create table agg_test (otdel text,empl text);
insert into agg_test values('ПРОГРАМЕРЫ','Паша');
insert into agg_test values('ПРОГРАМЕРЫ','Петя');
insert into agg_test values('ПРОГРАМЕРЫ','Полина');
insert into agg_test values('АДМИНЫ ', 'Игорь');
insert into agg_test values('АДМИНЫ ', 'Иван');
insert into agg_test values('ДИЗАЙНЕРЫ ','Модест');
insert into agg_test values('ДИЗАЙНЕРЫ ','Михаил');
//-------------------------------------------------
select distinct otdel, array_to_string(Array(select empl from agg_test where otdel = tbl.otdel),',') as empl
from agg_test tbl
//-------------------------------------------------
Главное, что без всяких вспомогательных функций, просто запрос... :-)
...
Рейтинг: 0 / 0
17.07.2008, 14:20
    #35436811
Robert Ayrapetyan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Новая задачка из той же серии:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create table radar (SampleID integer,SubmitterID integer);
insert into radar values( 1 , 1 );
insert into radar values( 1 , 2 );
insert into radar values( 1 , 3 );
insert into radar values( 2 , 1 );
insert into radar values( 2 , 2 );
insert into radar values( 3 , 1 );
insert into radar values( 3 , 2 );
CONSTRAINT fk_radar_ref_samples FOREIGN KEY ("SampleID")
      REFERENCES samples ("SampleID")
CONSTRAINT fk_radar_ref_users FOREIGN KEY ("SubmitterID")
      REFERENCES users ("UserID")

create table samples (SampleID integer, AnalystID integer);
insert into samples values( 1 , 1 );
insert into samples values( 2 , 2 );
insert into samples values( 3 , 3 );
CONSTRAINT "PK_samples" PRIMARY KEY ("SampleID")
CONSTRAINT fk_samples_ref_analysts FOREIGN KEY ("AnalystID")
      REFERENCES analysts ("UserID")

create table users (UserID integer, UserName text);
insert into users values( 1 ,"Вася");
insert into users values( 2 ,"Петя");
insert into users values( 3 ,"Саша");
CONSTRAINT "PK_users" PRIMARY KEY ("UserID")


Каким запросом можно вывести:

Код: plaintext
1.
2.
3.
4.
SampleID    Submitters                 Analyst
 1                Вася, Петя, Саша      Вася
 2                Вася, Петя               Петя
 3                Вася, Петя               Саша
...
Рейтинг: 0 / 0
18.07.2008, 08:22
    #35438187
Antoxa1982
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат в одну колонку
Примерно так, по аналогии разберешься...

select t0.userid,
array_to_string(Array(select username from users t1 where t1.userid in (select submitterid from radar where sampleid = t0.userid)),',')as submitterid,
array_to_string(Array(select username from users t2 where t2.userid in (select analystid from samples where sampleid = t0.userid)),',')as analystid

from users t0
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Результат в одну колонку / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]