首页 > 解决方案 > 如何在 PostgreSQL 中生成“假”行以用于 d3.js

问题描述

我有一个比较日期的查询,但问题是我需要列名是一行。这是我的查询:

SELECT
ROUND(AVG(availability_percentage)
   FILTER (WHERE availability_date BETWEEN '2020-03-01' AND '2020-04-01') , 2) AS avg_march,
ROUND(AVG(availability_percentage)
   FILTER (WHERE availability_date BETWEEN '2020-04-01' AND '2020-05-01'), 2) AS avg_april

FROM dashboard.availability WHERE availability_date BETWEEN '2020-03-01' AND '2020-05-01';

如您所见,我正在比较 3 月和 4 月的平均百分比结果,但问题是 avg_march 和 avg_april 是列名。我需要它是一个行结果,以便我可以将它转换为 JSON 并在条形图上的 D3.js 上使用它。

avg_march    avg_april
_________    _________
 98.28        95.60

但我需要的结果是:

month        average 
_________    _______
avg_march     98.28
avg_april     95.60

标签: sqlpostgresqld3.js

解决方案


试试下面的,这里是演示

SELECT
   unnest(array['avg_march', 'avg_april']) AS months,
   unnest(array[avg_march, avg_april]) AS values
FROM myTable

输出:

| months    | values |
| --------- | ------ |
| avg_march | 98.28  |
| avg_april | 95.6   |

crosstab()你也可以试试

create extension if not exists tablefunc;

select *
from crosstab
(
  'select *
  from myTable'
) as ct(months text, values float)

推荐阅读