【问题标题】:How to change column headers into rows values whic maps to multiple values in postgres如何将列标题更改为映射到 postgres 中的多个值的行值
【发布时间】:2021-09-30 07:52:27
【问题描述】:

我有一张如下表:

我正在尝试取出过去三个月通过失败跳过或待处理的测试用例总数,我使用以下查询:

SELECT unnest(array[to_char(CURRENT_DATE - INTERVAL '1 months', 'Month'), to_char(CURRENT_DATE - INTERVAL '1 months', 'Month'), to_char(CURRENT_DATE - INTERVAL '3 months', 'Month')]) AS metric,
unnest(array['passed', 'failed', 'pending', 'skipped']) AS "Values",   
unnest(array[total_test_cases_passed, total_test_cases_failed, total_test_cases_pending, total_test_cases_skipped]) AS "Count" 
FROM batch_details 
Where end_time >= date_trunc('month', now()) - interval '3 month' and end_time < date_trunc('month', now()) 
ORDER BY "Values";

但是这个查询没有显示完整的结果,它只显示 jun 的失败和通过,而 april 只显示未决的结果。 如下所示:

谁能帮我查询,以便显示所有结果。我实际上是在 grafana 中使用这个查询来创建一个图表,其中 x 轴将是几个月,y 轴将显示通过、失败、跳过、等待三个月的测试用例总数

【问题讨论】:

    标签: sql postgresql grafana


    【解决方案1】:

    您快到了,我认为缺少的一点是您需要在取消透视之前在正确的级别聚合数据。

    因此,如果您首先将数据与

    select 
        date_trunc('month', end_time) as month,
        (MAX(ARRAY[extract(epoch from end_time), total_test_cases_passed]))[2] as total_test_cases_passed, 
        (MAX(ARRAY[extract(epoch from end_time), total_test_cases_failed]))[2] as total_test_cases_failed,
        (MAX(ARRAY[extract(epoch from end_time), total_test_cases_pending]))[2] as total_test_cases_pending,
        (MAX(ARRAY[extract(epoch from end_time), total_test_cases_skipped]))[2] as total_test_cases_skipped
    from batch_details
    Where end_time >= date_trunc('month', now()) - interval '3 month' and end_time < date_trunc('month', now()) 
    group by date_trunc('month', end_time)
    

    那么您就可以正确地取消透视。整个查询是

    with overall_sum_per_month as(
        select 
            date_trunc('month', end_time) as month,
            (MAX(ARRAY[extract(epoch from end_time), total_test_cases_passed]))[2] as total_test_cases_passed, 
            (MAX(ARRAY[extract(epoch from end_time), total_test_cases_failed]))[2] as total_test_cases_failed,
            (MAX(ARRAY[extract(epoch from end_time), total_test_cases_pending]))[2] as total_test_cases_pending,
            (MAX(ARRAY[extract(epoch from end_time), total_test_cases_skipped]))[2] as total_test_cases_skipped
        from batch_details
        Where modality = 'CT' and end_time >= date_trunc('month', now()) - interval '3 month' and end_time < date_trunc('month', now()) 
        group by date_trunc('month', end_time)
    )
    select month,
        unnest(array['passed', 'failed', 'pending', 'skipped']),
        unnest(array[total_test_cases_passed, total_test_cases_failed, total_test_cases_pending, total_test_cases_skipped]) AS "Count" 
    FROM overall_sum_per_month;
    

    编辑:如果您需要当月的最后一个数字而不是sum 并过滤modality=CT,我根据以下讨论更改了上述查询

    【讨论】:

    • 然后将 sum 行替换为 (MAX(ARRAY[extract(epoch from end_time), total_test_cases_passed]))[2]
    • 非常感谢@Ftisiot 就像一个魅力,但我想要每个类别中的最新数据而不是总和,比如通过,失败跳过等待。你能帮我解决这个问题吗?我还需要添加条件 where modality = 'CT'
    • 在上面的查询中添加条件只是一个WHERE语句了
    • 您好,我进行了更改,但现在它说 total_test_cases_passed 列不存在我将查询作为答案发送,因为它没有被 cmets 接受
    • 感谢 alooooooot 最后一点工作得很好,目前我可以看到完整的日期,我怎么能只看到像 date_trunc('month', end_time) 这样的月份,=> 这会返回完整的日期,但我想查看我们可以使用 Extract (month from) => 的月份,但这只会返回月份编号而不是名称。如何实现这一目标
    【解决方案2】:

    与总和每月为( 选择 date_trunc('month', end_time) 作为月份, (MAX(ARRAY[extract(epoch from end_time), total_test_cases_passed]))[2], (MAX(ARRAY[extract(epoch from end_time), total_test_cases_failed]))[2], (MAX(ARRAY[extract(epoch from end_time), total_test_cases_pending]))[2], (MAX(ARRAY[extract(epoch from end_time), total_test_cases_skipped]))[2] 来自批处理详细信息 其中modality = 'CT' and end_time >= date_trunc('month', now()) - 间隔'3 month' and end_time 选择一个月, unnest(array['passed', 'failed', 'pending', 'skipped']), unnest(数组[total_test_cases_passed,total_test_cases_failed,total_test_cases_pending,total_test_cases_skipped])作为“计数” FROM total_sum_per_month;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2018-11-07
      • 2010-11-14
      • 2019-03-16
      • 2021-03-09
      • 2020-11-24
      • 1970-01-01
      相关资源
      最近更新 更多