web-dev-qa-db-ja.com

tablefuncクロス集計クエリの列名のサブクエリ

サブクエリからクロス集計クエリの列の名前の値を取得することは可能ですか?

CREATE TABLE mytable(employee_name text, month date, allocation double precision);
INSERT INTO mytable VALUES('A','2017-11-30','0.5');
INSERT INTO mytable VALUES('B','2017-11-30','0.8');
INSERT INTO mytable VALUES('B','2017-12-31','0.5');


SELECT * FROM crosstab
(
  'SELECT employee_name , month , allocation FROM mytable ORDER BY 1',
  'SELECT DISTINCT month FROM mytable ORDER BY 1'
)
AS
(
    employee_name text  
    # Here a subquery to get column names
    # automatically eg : 'SELECT DISTINCT month FROM mytable'
);
2
sav

解決策を見つけました。これは、これまでに見つかった最良のソリューションです。

https://github.com/hnsl/colpivot

0
sav

いいえ、結果セットのスキーマをテーブル内の値に依存させることはできません。ただし、動的SQLを使用してクエリを生成できます。

SELECT FORMAT($$

  SELECT * FROM crosstab
  (
    'SELECT employee_name , month , allocation FROM mytable ORDER BY 1',
    'SELECT DISTINCT month FROM mytable ORDER BY 1'
  )
  AS
  (
    employee_name text,
    %s
  )
$$,
  'something here...'
);

今、あなたはそれを記入したいだけです'something here..'

SELECT FORMAT(
    $$
        SELECT * FROM crosstab
        (
            'SELECT employee_name , month , allocation
             FROM mytable
            ORDER BY 1, 2',
            'SELECT DISTINCT month FROM mytable ORDER BY 1'
        )
        AS
        (
            employee_name text,
            %s
        )
    $$,
    string_agg(
        FORMAT('%I %s', month, 'double precision'), ', '
        ORDER BY month
    )
)
FROM (
    SELECT DISTINCT month
    FROM mytable
)
    AS t;

次に、生成するクエリを実行してください。

 employee_name | 2017-11-30 | 2017-12-31 
---------------+------------+------------
 A             |        0.5 |           
 B             |        0.8 |        0.5
(2 rows)
2
Evan Carroll