postgres 行到列

zig*_*ggy 2 postgresql pivot

我有一个非常简单的 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;
Run Code Online (Sandbox Code Playgroud)

这返回

在此输入图像描述

我希望县名成为列标题。我知道有一个交叉表函数,并且我在这里看到了他们使用它的许多帖子,但我无法让它处理这个查询。

Eva*_*oll 5

正如我所说,使用简化它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;
Run Code Online (Sandbox Code Playgroud)

现在把它包起来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
);
Run Code Online (Sandbox Code Playgroud)

更新

  1. 忘记将 row_name 放入year定义中。
  2. 您可能必须转换date_s为 int
  3. 您可能必须转换count(DISTINCT...)为 int(或 bigint 并更改类型)。
  4. 您必须确保提供了样本数据中的所有县。或者,粘贴 的结果SELECT DISTINCT county FROM air_quality2;