@@ -2714,188 +2714,3 @@ NOTICE: foo
27142714CONTEXT: PL/pgSQL function inline_code_block line 3 at RAISE
27152715ERROR: bar
27162716CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
2717- --
2718- -- \crosstabview
2719- --
2720- CREATE TABLE ctv_data (v, h, c, i, d) AS
2721- VALUES
2722- ('v1','h2','foo', 3, '2015-04-01'::date),
2723- ('v2','h1','bar', 3, '2015-01-02'),
2724- ('v1','h0','baz', NULL, '2015-07-12'),
2725- ('v0','h4','qux', 4, '2015-07-15'),
2726- ('v0','h4','dbl', -3, '2014-12-15'),
2727- ('v0',NULL,'qux', 5, '2014-07-15'),
2728- ('v1','h2','quux',7, '2015-04-04');
2729- -- running \crosstabview after query uses query in buffer
2730- SELECT v, EXTRACT(year FROM d), count(*)
2731- FROM ctv_data
2732- GROUP BY 1, 2
2733- ORDER BY 1, 2;
2734- v | date_part | count
2735- ----+-----------+-------
2736- v0 | 2014 | 2
2737- v0 | 2015 | 1
2738- v1 | 2015 | 3
2739- v2 | 2015 | 1
2740- (4 rows)
2741-
2742- -- basic usage with 3 columns
2743- \crosstabview
2744- v | 2014 | 2015
2745- ----+------+------
2746- v0 | 2 | 1
2747- v1 | | 3
2748- v2 | | 1
2749- (3 rows)
2750-
2751- -- ordered months in horizontal header, quoted column name
2752- SELECT v, to_char(d, 'Mon') AS "month name", EXTRACT(month FROM d) AS num,
2753- count(*) FROM ctv_data GROUP BY 1,2,3 ORDER BY 1
2754- \crosstabview v "month name":num 4
2755- v | Jan | Apr | Jul | Dec
2756- ----+-----+-----+-----+-----
2757- v0 | | | 2 | 1
2758- v1 | | 2 | 1 |
2759- v2 | 1 | | |
2760- (3 rows)
2761-
2762- -- ordered months in vertical header, ordered years in horizontal header
2763- SELECT EXTRACT(year FROM d) AS year, to_char(d,'Mon') AS "month name",
2764- EXTRACT(month FROM d) AS month,
2765- format('sum=%s avg=%s', sum(i), avg(i)::numeric(2,1))
2766- FROM ctv_data
2767- GROUP BY EXTRACT(year FROM d), to_char(d,'Mon'), EXTRACT(month FROM d)
2768- ORDER BY month
2769- \crosstabview "month name" year:year format
2770- month name | 2014 | 2015
2771- ------------+-----------------+----------------
2772- Jan | | sum=3 avg=3.0
2773- Apr | | sum=10 avg=5.0
2774- Jul | sum=5 avg=5.0 | sum=4 avg=4.0
2775- Dec | sum=-3 avg=-3.0 |
2776- (4 rows)
2777-
2778- -- combine contents vertically into the same cell (V/H duplicates)
2779- SELECT v, h, string_agg(c, E'\n') FROM ctv_data GROUP BY v, h ORDER BY 1,2,3
2780- \crosstabview 1 2 3
2781- v | h4 | | h0 | h2 | h1
2782- ----+-----+-----+-----+------+-----
2783- v0 | qux+| qux | | |
2784- | dbl | | | |
2785- v1 | | | baz | foo +|
2786- | | | | quux |
2787- v2 | | | | | bar
2788- (3 rows)
2789-
2790- -- horizontal ASC order from window function
2791- SELECT v,h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h) AS r
2792- FROM ctv_data GROUP BY v, h ORDER BY 1,3,2
2793- \crosstabview v h:r c
2794- v | h0 | h1 | h2 | h4 |
2795- ----+-----+-----+------+-----+-----
2796- v0 | | | | qux+| qux
2797- | | | | dbl |
2798- v1 | baz | | foo +| |
2799- | | | quux | |
2800- v2 | | bar | | |
2801- (3 rows)
2802-
2803- -- horizontal DESC order from window function
2804- SELECT v, h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h DESC) AS r
2805- FROM ctv_data GROUP BY v, h ORDER BY 1,3,2
2806- \crosstabview v h:r c
2807- v | | h4 | h2 | h1 | h0
2808- ----+-----+-----+------+-----+-----
2809- v0 | qux | qux+| | |
2810- | | dbl | | |
2811- v1 | | | foo +| | baz
2812- | | | quux | |
2813- v2 | | | | bar |
2814- (3 rows)
2815-
2816- -- horizontal ASC order from window function, NULLs pushed rightmost
2817- SELECT v,h, string_agg(c, E'\n') AS c, row_number() OVER(ORDER BY h NULLS LAST) AS r
2818- FROM ctv_data GROUP BY v, h ORDER BY 1,3,2
2819- \crosstabview v h:r c
2820- v | h0 | h1 | h2 | h4 |
2821- ----+-----+-----+------+-----+-----
2822- v0 | | | | qux+| qux
2823- | | | | dbl |
2824- v1 | baz | | foo +| |
2825- | | | quux | |
2826- v2 | | bar | | |
2827- (3 rows)
2828-
2829- -- only null, no column name, 2 columns: error
2830- SELECT null,null \crosstabview
2831- The query must return at least two columns to be shown in crosstab
2832- -- only null, no column name, 3 columns: works
2833- SELECT null,null,null \crosstabview
2834- ?column? |
2835- ----------+--
2836- |
2837- (1 row)
2838-
2839- -- null display
2840- \pset null '#null#'
2841- SELECT v,h, string_agg(i::text, E'\n') AS i FROM ctv_data
2842- GROUP BY v, h ORDER BY h,v
2843- \crosstabview v h i
2844- v | h0 | h1 | h2 | h4 | #null#
2845- ----+--------+----+----+----+--------
2846- v1 | #null# | | 3 +| |
2847- | | | 7 | |
2848- v2 | | 3 | | |
2849- v0 | | | | 4 +| 5
2850- | | | | -3 |
2851- (3 rows)
2852-
2853- \pset null ''
2854- -- refer to columns by position
2855- SELECT v,h,string_agg(i::text, E'\n'), string_agg(c, E'\n')
2856- FROM ctv_data GROUP BY v, h ORDER BY h,v
2857- \crosstabview 2 1 4
2858- h | v1 | v2 | v0
2859- ----+------+-----+-----
2860- h0 | baz | |
2861- h1 | | bar |
2862- h2 | foo +| |
2863- | quux | |
2864- h4 | | | qux+
2865- | | | dbl
2866- | | | qux
2867- (5 rows)
2868-
2869- -- refer to columns by positions and names mixed
2870- SELECT v,h, string_agg(i::text, E'\n') AS i, string_agg(c, E'\n') AS c
2871- FROM ctv_data GROUP BY v, h ORDER BY h,v
2872- \crosstabview 1 "h" 4
2873- v | h0 | h1 | h2 | h4 |
2874- ----+-----+-----+------+-----+-----
2875- v1 | baz | | foo +| |
2876- | | | quux | |
2877- v2 | | bar | | |
2878- v0 | | | | qux+| qux
2879- | | | | dbl |
2880- (3 rows)
2881-
2882- -- error: bad column name
2883- SELECT v,h,c,i FROM ctv_data
2884- \crosstabview v h j
2885- Invalid column name: j
2886- -- error: bad column number
2887- SELECT v,h,i,c FROM ctv_data
2888- \crosstabview 2 1 5
2889- Invalid column number: 5
2890- -- error: same H and V columns
2891- SELECT v,h,i,c FROM ctv_data
2892- \crosstabview 2 h 4
2893- The same column cannot be used for both vertical and horizontal headers
2894- -- error: too many columns
2895- SELECT a,a,1 FROM generate_series(1,3000) AS a
2896- \crosstabview
2897- Maximum number of columns (1600) exceeded
2898- -- error: only one column
2899- SELECT 1 \crosstabview
2900- The query must return at least two columns to be shown in crosstab
2901- DROP TABLE ctv_data;
0 commit comments