【问题标题】:How to show multiple query results together with column name?如何将多个查询结果与列名一起显示?
【发布时间】:2021-09-30 21:35:00
【问题描述】:

我有四个查询,数据取自同一张表。

select sum(unit_sold) as total_unit_sold 
from tewt 
where order_priority = 'HH'

union all

select avg(unit_sold) as average_unit_sold 
from tewt 
where order_priority = 'H'

union all

select max(unit_sold) as maximum_unit_sold 
from tewt 
where order_priority = 'M'

union all

select min(unit_sold) as minimum_unit_sold 
from tewt 
where order_priority = 'L';

我使用“Union All”来描述所有没有行名和列名的结果。

结果:

total_unit_sold (numeric)
1. 2401
2. 5362.00
3. 7699
4. 6184

但我不知道如何将它们与每个结果的列/行名称一起显示。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 模拟你想要的输出会有帮助。

标签: sql postgresql join group-by union-all


【解决方案1】:

将每个选择作为列表达式,而不是UNION ALL将它们放在一起;这允许您为每个子选择分配一个列名。

SELECT
    (select sum(unit_sold) from tewt where order_priority='HH') as total_unit_sold,
    (select avg(unit_sold) from tewt where order_priority='H') as average_unit_sold,
    (select max(unit_sold) from tewt where order_priority='M') as maximum_unit_sold,
    (select min(unit_sold) from tewt where order_priority='L') as minimum_unit_sold;

不清楚您所说的“行名”是什么意思 - 您有 4 个值,因此它或者是 4 行 x 1 列,就像您已经拥有的一样,或者是 1 行 x 4 列,如上所示。如果您想要的是 4x4,行标记为“HH”、“H”、“M”、“L”,列标记为现有查询中的列,新单元格为 NULLS,这也是可能的,但涉及更多&我如果是这样的话,我会让你澄清一下。

【讨论】:

    【解决方案2】:

    如果您对 4 种情况使用 CASE 表达式,则可以在 1 个查询中完成:

    SELECT order_priority, 
           CASE order_priority
             WHEN 'HH' THEN 'total_unit_sold' 
             WHEN 'H' THEN 'average_unit_sold'
             WHEN 'M' THEN 'maximum_unit_sold'
             WHEN 'L' THEN 'minimum_unit_sold'
           END description, 
           CASE order_priority
             WHEN 'HH' THEN SUM(unit_sold) 
             WHEN 'H' THEN AVG(unit_sold) 
             WHEN 'M' THEN MAX(unit_sold) 
             WHEN 'L' THEN MIN(unit_sold) 
           END amount
    FROM tewt 
    WHERE order_priority IN ('HH', 'H', 'M', 'L')
    GROUP BY order_priority 
    

    如果您希望将所有值作为 1 行中的 4 列,您可以使用条件聚合来实现:

    SELECT SUM(CASE WHEN order_priority = 'HH' THEN unit_sold END) total_unit_sold,
           AVG(CASE WHEN order_priority = 'H' THEN unit_sold END) average_unit_sold,
           MAX(CASE WHEN order_priority = 'M' THEN unit_sold END) maximum_unit_sold,
           MIN(CASE WHEN order_priority = 'L' THEN unit_sold END) minimum_unit_sold       
    FROM tewt 
    WHERE order_priority IN ('HH', 'H', 'M', 'L');
    

    或者:

    SELECT SUM(unit_sold) FILTER (WHERE order_priority = 'HH') total_unit_sold,
           AVG(unit_sold) FILTER (WHERE order_priority = 'H') average_unit_sold,
           MAX(unit_sold) FILTER (WHERE order_priority = 'M') maximum_unit_sold,
           MIN(unit_sold) FILTER (WHERE order_priority = 'L') minimum_unit_sold       
    FROM tewt 
    WHERE order_priority IN ('HH', 'H', 'M', 'L');
    

    如果'HH''H''M''L'order_priority 的唯一可能值,则可以删除WHERE 子句。

    【讨论】:

    • 最后两个查询给出了想要的结果,谢谢
    • 第一个非常独特,很高兴知道,谢谢
    • 哦,我明白了,我不能接受两个人的答案哈哈……我是新来的
    【解决方案3】:

    在 Postgres 中,您将使用条件聚合,它使用 filter 子句:

    select sum(unit_sold) filter (where order_priority = 'HH') as hh_total_unit_sold,
           sum(unit_sold) filter (where order_priority = 'H') as h_total_unit_sold,
           sum(unit_sold) filter (where order_priority = 'M') as m_total_unit_sold,
           sum(unit_sold) filter (where order_priority = 'L') as l_total_unit_sold       
    from tewt ;
    

    【讨论】:

    • 不,这没有给出正确的结果
    • 您的评论没有帮助。这怎么不是你想要的结果?它应该与您的问题中的逻辑完全相同,除了行中的值在列中。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2021-02-24
    • 1970-01-01
    • 2013-09-01
    • 2015-11-11
    • 2013-04-08
    相关资源
    最近更新 更多