aboutsummaryrefslogtreecommitdiff
path: root/contrib/tablefunc/README.tablefunc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tablefunc/README.tablefunc')
-rw-r--r--contrib/tablefunc/README.tablefunc110
1 files changed, 70 insertions, 40 deletions
diff --git a/contrib/tablefunc/README.tablefunc b/contrib/tablefunc/README.tablefunc
index 7097ef00957..63b1c17d8ec 100644
--- a/contrib/tablefunc/README.tablefunc
+++ b/contrib/tablefunc/README.tablefunc
@@ -57,11 +57,16 @@ Installation:
but you can create additional crosstab functions per the instructions
in the documentation below.
- crosstab(text sql, N int)
+ crosstab(text sql)
- returns a set of row_name plus N category value columns
- requires anonymous composite type syntax in the FROM clause. See
the instructions in the documentation below.
+ crosstab(text sql, N int)
+ - obsolete version of crosstab()
+ - the argument N is now ignored, since the number of value columns
+ is always determined by the calling query
+
connectby(text relname, text keyid_fld, text parent_keyid_fld
[, text orderby_fld], text start_with, int max_depth
[, text branch_delim])
@@ -133,7 +138,7 @@ Inputs
A SQL statement which produces the source set of data. The SQL statement
must return one row_name column, one category column, and one value
- column.
+ column. row_name and value must be of type text.
e.g. provided sql must produce a set something like:
@@ -152,15 +157,15 @@ Outputs
Returns setof tablefunc_crosstab_N, which is defined by:
- CREATE VIEW tablefunc_crosstab_N AS
- SELECT
- ''::TEXT AS row_name,
- ''::TEXT AS category_1,
- ''::TEXT AS category_2,
+ CREATE TYPE tablefunc_crosstab_N AS (
+ row_name TEXT,
+ category_1 TEXT,
+ category_2 TEXT,
.
.
.
- ''::TEXT AS category_N;
+ category_N TEXT
+ );
for the default installed functions, where N is 2, 3, or 4.
@@ -188,31 +193,9 @@ Notes
6. The installed defaults are for illustration purposes. You
can create your own return types and functions based on the
- crosstab() function of the installed library.
-
- The return type must have a first column that matches the data
- type of the sql set used as its source. The subsequent category
- columns must have the same data type as the value column of the
- sql result set.
-
- Create a VIEW to define your return type, similar to the VIEWS
- in the provided installation script. Then define a unique function
- name accepting one text parameter and returning setof your_view_name.
- For example, if your source data produces row_names that are TEXT,
- and values that are FLOAT8, and you want 5 category columns:
+ crosstab() function of the installed library. See below for
+ details.
- CREATE VIEW my_crosstab_float8_5_cols AS
- SELECT
- ''::TEXT AS row_name,
- 0::FLOAT8 AS category_1,
- 0::FLOAT8 AS category_2,
- 0::FLOAT8 AS category_3,
- 0::FLOAT8 AS category_4,
- 0::FLOAT8 AS category_5;
-
- CREATE OR REPLACE FUNCTION crosstab_float8_5_cols(text)
- RETURNS setof my_crosstab_float8_5_cols
- AS '$libdir/tablefunc','crosstab' LANGUAGE 'c' STABLE STRICT;
Example usage
@@ -241,11 +224,12 @@ select * from crosstab3(
==================================================================
Name
-crosstab(text, int) - returns a set of row_name
- plus N category value columns
+crosstab(text) - returns a set of row_names plus category value columns
Synopsis
+crosstab(text sql)
+
crosstab(text sql, int N)
Inputs
@@ -271,15 +255,16 @@ Inputs
N
- number of category value columns
+ Obsolete argument; ignored if supplied (formerly this had to match
+ the number of category columns determined by the calling query)
Outputs
- Returns setof record, which must defined with a column definition
+ Returns setof record, which must be defined with a column definition
in the FROM clause of the SELECT statement, e.g.:
SELECT *
- FROM crosstab(sql, 2) AS ct(row_name text, category_1 text, category_2 text);
+ FROM crosstab(sql) AS ct(row_name text, category_1 text, category_2 text);
the example crosstab function produces a set something like:
<== values columns ==>
@@ -292,9 +277,12 @@ Notes
1. The sql result must be ordered by 1,2.
- 2. The number of values columns is determined at run-time. The
- column definition provided in the FROM clause must provide for
- N + 1 columns of the proper data types.
+ 2. The number of values columns is determined by the column definition
+ provided in the FROM clause. The FROM clause must define one
+ row_name column (of the same datatype as the first result column
+ of the sql query) followed by N category columns (of the same
+ datatype as the third result column of the sql query). You can
+ set up as many category columns as you wish.
3. Missing values (i.e. not enough adjacent rows of same row_name to
fill the number of result values columns) are filled in with nulls.
@@ -304,6 +292,44 @@ Notes
5. Rows with all nulls in the values columns are skipped.
+ 6. You can avoid always having to write out a FROM clause that defines the
+ output columns by setting up a custom crosstab function that has
+ the desired output row type wired into its definition.
+
+ There are two ways you can set up a custom crosstab function:
+
+ A. Create a composite type to define your return type, similar to the
+ examples in the installation script. Then define a unique function
+ name accepting one text parameter and returning setof your_type_name.
+ For example, if your source data produces row_names that are TEXT,
+ and values that are FLOAT8, and you want 5 category columns:
+
+ CREATE TYPE my_crosstab_float8_5_cols AS (
+ row_name TEXT,
+ category_1 FLOAT8,
+ category_2 FLOAT8,
+ category_3 FLOAT8,
+ category_4 FLOAT8,
+ category_5 FLOAT8
+ );
+
+ CREATE OR REPLACE FUNCTION crosstab_float8_5_cols(text)
+ RETURNS setof my_crosstab_float8_5_cols
+ AS '$libdir/tablefunc','crosstab' LANGUAGE 'c' STABLE STRICT;
+
+ B. Use OUT parameters to define the return type implicitly.
+ The same example could also be done this way:
+
+ CREATE OR REPLACE FUNCTION crosstab_float8_5_cols(IN text,
+ OUT row_name TEXT,
+ OUT category_1 FLOAT8,
+ OUT category_2 FLOAT8,
+ OUT category_3 FLOAT8,
+ OUT category_4 FLOAT8,
+ OUT category_5 FLOAT8)
+ RETURNS setof record
+ AS '$libdir/tablefunc','crosstab' LANGUAGE 'c' STABLE STRICT;
+
Example usage
@@ -418,6 +444,10 @@ Notes
5. Rows with a null row_name column are skipped.
+ 6. You can create predefined functions to avoid having to write out
+ the result column names/types in each query. See the examples
+ for crosstab(text).
+
Example usage