我正在尝试生成以下输出:
类型 | 总数 |
---|---|
成本A | 1500 |
成本B | 200 |
成本C | 300 |
来自具有这种结构的表:
CostA
CostB
CostC
name
date
-- more columns ...
表格有更多列,但我只想要其中 3 列的总和。
我特别需要这个结构,因为 superset 需要这样的结构来生成一些图表。
有什么想法吗?
如您所见,该表有更多列,但我只想要总和 3 列。
您可以使用
union all
来做到这一点:
SELECT 'CostA' AS type, SUM(CostA) AS totals FROM table_name
UNION ALL
SELECT 'CostB' AS type, SUM(CostB) AS totals FROM table_name
UNION ALL
SELECT 'CostC' AS type, SUM(CostC) AS totals FROM table_name;
您可以使用
unnest()
如下:
with cte as (
select sum(CostA) as CostA, sum(CostB) as CostB, sum(CostC) as CostC
from mytable
)
SELECT
unnest(array['CostA', 'CostB', 'CostC']) AS type,
unnest(array[CostA, CostB, CostC]) AS total
FROM cte
ORDER BY total
如果源表很大,则需要在 单个
SELECT
中计算所有总和(接近成本的 1/3),然后对结果进行透视 - 在 VALUES
连接中使用 LATERAL
表达式:
SELECT pivot.*
FROM (
SELECT sum(CostA) AS a
, sum(CostB) AS b
, sum(CostC) AS c
FROM tbl
) sub
CROSS JOIN LATERAL (
VALUES
('CostA', a)
, ('CostB', b)
, ('CostC', c)
) pivot(type, total);
参见:
旁白:尽可能避免在 Postgres 中使用 CaMeL 大小写标识符。参见: