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

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

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





...She gave me something, it was a mushroom...
...
Рейтинг: 0 / 0
Результат в одну колонку
    #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
Результат в одну колонку
    #34531041
ShadyAngel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зверски... А для подобной цели хранимку писал, на 15 строк.
Большое спасибо :)
...
Рейтинг: 0 / 0
Результат в одну колонку
    #34536284
_Chester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем.

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

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



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

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

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

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

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

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

Теперь только вопрос - то же самое сделать, если вместо "Пети", "Васи" и "Коли" в agg_test хранятся их ключи, но вывести все-таки нужно по именам.Сделать запрос из двух таблиц. Связать их по ключам. А в аггрегатную функцию пихануть поле из таблицы, где хранятся имена.
...
Рейтинг: 0 / 0
Результат в одну колонку
    #35425928
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вернее, не так выразился... можно ли сгруппировать, если в программерах два пети
...
Рейтинг: 0 / 0
Результат в одну колонку
    #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
Результат в одну колонку
    #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
Результат в одну колонку
    #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
Результат в одну колонку
    #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
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Результат в одну колонку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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