powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция Pl/PgSql
10 сообщений из 10, страница 1 из 1
функция Pl/PgSql
    #33103457
andrew_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, есть таблица с данными:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
+--------+-----------+-----------+
| Дата   | Параметр  | Значение  |
+--------+-----------+-----------+
|  10      |  a        |  1          |
|  10      |  b        |  2          |
|  10      |  c        |  3          |
|  11      |  ...      | ...       |
+--------+-----------+-----------+
В результате отображать надо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
+---------+---+---+---+
| Дата    | a | b | c |
+---------+---+---+---+
|  10       |  1  |  2  |  3  |
|  11       |...|...|...|
+---------+---+---+---+
Количество параметров a, b, c... ограничен и заранее известен...
(такая структура сделана для поддержки расширения...)

Пробовал делать через функцию возвращающую наборы... объявил тип данных, как последовательность из даты, и параметров (аналогично результирующему набору) но особо не приуспел... может вообще не с той стороны пошел... а если иду правильно, киньте примерчик реализации... заранее благодарен!
_______________
Андрей
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33103478
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, если можно, уточните: вам нужно чтобы SQL запрос выдавал результаты в таком виде или просто на клиенте так отображалось?
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33103508
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create function coalesce_ag_f(anyelement, anyelement) returns anyelement as $$
	select coalesce($ 1 ,$ 2 );
$$
language sql;

create aggregate coalesce_ag (
	BASETYPE=anyelement,
	SFUNC=coalesce_ag_f,
	STYPE=anyelement
);

select "Дата",coalesce_ag(a) as a,coalesce_ag(b) as b,coalesce_ag(c) as c
from 
(select "Дата",
    case "Параметр" when 'a' then "Значение" else NULL end as a,
    case "Параметр" when 'b' then "Значение" else NULL end as b,
    case "Параметр" when 'c' then "Значение" else NULL end as c
from "Таблица")  as t
group by "Дата";
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104120
andrew_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
XMА, если можно, уточните: вам нужно чтобы SQL запрос выдавал результаты в таком виде или просто на клиенте так отображалось?

Чтобы просто на клиенте так отображалось... Я использую Npgsql (для .NET) и как сделать такое отображение уже на стороне клиента средствами C# не очень представляю... Поэтому подумал, что лучше это все на стороне базы обернуть в нужный вид и выдать клиенту для отображения, так сказать, AS IS...
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104224
andrew_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falcon
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create function coalesce_ag_f(anyelement, anyelement) returns anyelement as $$
	select coalesce($ 1 ,$ 2 );
$$
language sql;

create aggregate coalesce_ag (
	BASETYPE=anyelement,
	SFUNC=coalesce_ag_f,
	STYPE=anyelement
);

select "Дата",coalesce_ag(a) as a,coalesce_ag(b) as b,coalesce_ag(c) as c
from 
(select "Дата",
    case "Параметр" when 'a' then "Значение" else NULL end as a,
    case "Параметр" when 'b' then "Значение" else NULL end as b,
    case "Параметр" when 'c' then "Значение" else NULL end as c
from "Таблица")  as t
group by "Дата";


Спасибо, это действительно работает так как нужно... как много я оказывается еще не знаю... благодарю...
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104237
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pivoting in SQL

Код: 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.
create table data (
 id   integer,
 para text,
 valu integer
);

insert into data values (  10 , 'a',  1  );
insert into data values (  10 , 'b',  2  );
insert into data values (  10 , 'c',  3  );
insert into data values (  11 , 'a',  4  );
insert into data values (  11 , 'b',  5  );
insert into data values (  12 , 'b',  6  );
insert into data values (  12 , 'c',  7  );
insert into data values (  13 , 'a',  8  );

create table data_pivot (
 para text,
 a    integer,
 b    integer,
 c    integer
);

insert into data_pivot values ( 'a',  1 ,  0 ,  0  );
insert into data_pivot values ( 'b',  0 ,  1 ,  0  );
insert into data_pivot values ( 'c',  0 ,  0 ,  1  );

select id, sum(a*valu) as a, sum(b*valu) as b, sum(c*valu) as c
 from data join data_pivot using (para) group by id;

drop table data_pivot;

drop table data;
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104332
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_xp XMА, если можно, уточните: вам нужно чтобы SQL запрос выдавал результаты в таком виде или просто на клиенте так отображалось?

Чтобы просто на клиенте так отображалось... Я использую Npgsql (для .NET) и как сделать такое отображение уже на стороне клиента средствами C# не очень представляю... Поэтому подумал, что лучше это все на стороне базы обернуть в нужный вид и выдать клиенту для отображения, так сказать, AS IS...
Мне иногда просто приходилось отображать данные в виде таких таблиц, но с нефиксированным кол-вом колонок, и делалось это так (схематично, C# давно не ковырял ) :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 ArrayList rows= new  ArrayList();
 ArrayList cols= new  ArrayList();
 // схема a_table ( data int, param varchar, value varchar, unique(data, param) )
 // в rows загоняем результат запроса "select distinct data from a_table order by 1"
 // в cols загоняем результат запроса "select distinct param from a_table order by 1"
 Object[][] data= new  Object[rows.Count][cols.Count]; // табличка с данными
 NpgsqlDataAdapter  myCommand =  new  NpgsqlDataAdapter("select data, param, value from a_table", myConnection);
 DataSet ds= new  DataSet();
 myCommand.Fill(ds,"a_table");
 // заполнение таблички данными
  for (DataRow row in ds.Tables["a_table"].Rows)
 {
         int  i=rows.IndexOf(row["data"]);
         int  j=cols.IndexOf(row["param"]);
        data[i][j]=row["value"];
 }
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104339
andrew_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, это действительно работает так как нужно... как много я оказывается еще не знаю... благодарю...

Забыл спросить, вдогонку:
С точки зрения производительности - на больших объемах (около 1 млн. записей) этот запрос будет сильно подтормаживать?
заранее благодарен...
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104369
andrew_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы просто на клиенте так отображалось... Я использую Npgsql (для .NET) и как сделать такое отображение уже на стороне клиента средствами C# не очень представляю... Поэтому подумал, что лучше это все на стороне базы обернуть в нужный вид и выдать клиенту для отображения, так сказать, AS IS...[/quot]
Мне иногда просто приходилось отображать данные в виде таких таблиц, но с нефиксированным кол-вом колонок, и делалось это так (схематично, C# давно не ковырял )...
[/quot]
Да, об этом я действительно не подумал... а интересно - каким способом будет быстрей - уже на клиенте, или на стороне сервера? (сервер обслуживает одновременно менее 10 клиентов (скорее именно одновременно не более 2-3) в стомегабитной локалке).
...
Рейтинг: 0 / 0
функция Pl/PgSql
    #33104386
andrew_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat Pivoting in SQL

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


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