Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функция Pl/PgSql / 10 сообщений из 10, страница 1 из 1
06.06.2005, 18:44
    #33103457
andrew_xp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
Господа, есть таблица с данными:
Код: 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
06.06.2005, 18:56
    #33103478
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
А, если можно, уточните: вам нужно чтобы SQL запрос выдавал результаты в таком виде или просто на клиенте так отображалось?
...
Рейтинг: 0 / 0
06.06.2005, 19:13
    #33103508
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
Код: 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
07.06.2005, 10:38
    #33104120
andrew_xp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
XMА, если можно, уточните: вам нужно чтобы SQL запрос выдавал результаты в таком виде или просто на клиенте так отображалось?

Чтобы просто на клиенте так отображалось... Я использую Npgsql (для .NET) и как сделать такое отображение уже на стороне клиента средствами C# не очень представляю... Поэтому подумал, что лучше это все на стороне базы обернуть в нужный вид и выдать клиенту для отображения, так сказать, AS IS...
...
Рейтинг: 0 / 0
07.06.2005, 11:11
    #33104224
andrew_xp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
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
07.06.2005, 11:15
    #33104237
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
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
07.06.2005, 11:36
    #33104332
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
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
07.06.2005, 11:38
    #33104339
andrew_xp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
функция Pl/PgSql
Спасибо, это действительно работает так как нужно... как много я оказывается еще не знаю... благодарю...

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

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


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