web-dev-qa-db-ja.com

postgres行から列へ

私はこのかなり単純なSQLクエリを持っています

SELECT count(date_mdy) AS unique_date_count,
  county,
  date_s
FROM (
  SELECT date_mdy,
    county,
    date_s 
  FROM air_quality2
  GROUP BY county, date_s ,date_mdy 
  ORDER BY county, date_s
) AS t1 
GROUP BY county, date_s 
ORDER BY date_s;

これは戻る

enter image description here

郡名を列ヘッダーにしたい。私はクロス集計関数があることを知っており、ここでそれらを使用する多くの投稿を見てきましたが、このクエリで機能させることができません。

1
ziggy

言ったように、count(DISTINCT...)を使用して単純化します

_SELECT county,
  date_s,
  count(DISTINCT date_mdy) AS unique_date_count
FROM air_quality2
GROUP BY county,
  date_s
ORDER BY 1,2;
_

crosstab で囲みます

_SELECT *
FROM crosstab($$
    SELECT county,
      date_s::int,
      count(DISTINCT date_mdy) AS unique_date_count 
    FROM air_quality2
    GROUP BY county,
      date_s
    ORDER BY 1,2;
  $$,
  $$ SELECT DISTINCT county FROM air_quality2; $$
)
AS ct(
  year               int,
  "Bergen County"    int,
  "Essex County"     int,
  "Hunterdon County" int,
  "Middlesex County" int,
  "Monmouth County"  int,
  "Morris County"    int,
  "Union County"     int
);
_

更新

  1. row_name yearを定義に含めるのを忘れました。
  2. _date_s_をintにキャストする必要がある場合があります
  3. count(DISTINCT...)をintにキャストする必要がある場合があります(またはbigintを使用して型を変更します)。
  4. サンプルデータのすべての郡を指定したことを確認する必要があります。または、_SELECT DISTINCT county FROM air_quality2;_の結果を貼り付けます。
3
Evan Carroll