查询以将多列的总和作为单独的行返回

问题描述 投票:0回答:3

我正在尝试生成以下输出:

类型 总数
成本A 1500
成本B 200
成本C 300

来自具有这种结构的表:

CostA
CostB
CostC
name
date
-- more columns ...

表格有更多列,但我只想要其中 3 列的总和。

我特别需要这个结构,因为 superset 需要这样的结构来生成一些图表。

有什么想法吗?

sql postgresql pivot aggregate apache-superset
3个回答
0
投票

如您所见,该表有更多列,但我只想要总和 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;

0
投票

您可以使用

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

0
投票

如果源表很大,则需要在 单个

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 大小写标识符。参见:

© www.soinside.com 2019 - 2024. All rights reserved.