繁体   English   中英

将列添加到 Postgres 动态查询的结果

[英]Add Column to Result of Postgres Dynamic Query

我有一个看起来像这样的表:


| Scenario| Date   | System | Result |
| ------- | ------ | ------ | ------ |
| Proj1   | 07-01  | A      | PASS   |
| Proj1   | 07-01  | B      | PASS   |
| Proj1   | 07-01  | C      | PASS   |
| Proj1   | 07-01  | D      | PASS   |
| Proj1   | 07-02  | A      | FAIL   |
| Proj1   | 07-02  | B      | FAIL   |
| Proj1   | 07-02  | C      | FAIL   |
| Proj1   | 07-02  | D      | FAIL   |
| Proj2   | 07-01  | E      | PASS   |
| Proj2   | 07-01  | F      | FAIL   |
| Proj2   | 07-02  | E      | PASS   |
| Proj2   | 07-02  | F      | PASS   |

我将其重新排列为:

| Project | Date | System1 | System2 | System3 | System4| Overall|
| ------- | ---- | ------- | ------- | ------- | -------|--------|
| Proj1   | 07-01| A-PASS  | B-PASS  | C-PASS  | D-PASS |PASS    |
| Proj1   | 07-02| A-FAIL  | B-FAIL  | C-FAIL  | D-FAIL |FAIL    |
| Proj2   | 07-01| E-PASS  | F-FAIL  |         |        |FAIL    |
| Proj2   | 07-02| E-PASS  | F-PASS  |         |        |PASS    |

我想根据上表创建一个包含此数据的图表

|Date  |# of Passes|# of Fails|
|------|-----------|----------|
|07-01 | 1         |  1       |
|07-02 | 1         |  1       |

您可以通过Count(*) over (Partition By Scenario,Date)来找到特定 (Date,Scenario) 的所有系统的计数,并通过使用Aggregate Filter作为该 (Date,Scenario) 仅通过系统的计数以下, count(*) filter (where Result='PASS') over (Partition By Scenario,Date)

然后比较两个计数,如果它们相等,则将整体结果设置为PASS

考虑以下:

Create Or Replace Function pvt()
    RETURNS void
    LANGUAGE 'plpgsql'
As $body$
declare
    sqlColumn varchar;
    qr varchar;
    columnlist varchar;
Begin
sqlColumn= 'select distinct D.sys_cat from (select Row_Number() Over (Partition By Scenario,Date Order By System) as sys_cat From run) D order by D.sys_cat;';
qr='prepare pvtstmt AS Select D.Scenario,D.Date,';

For columnlist In EXECUTE sqlColumn  
   Loop
      qr=qr || 'Max(Case When sys_cat=' || columnlist || ' Then (System || ''_'' || Result) Else '''' End) As System' ||  columnlist ||  ' , ';
   END LOOP;
   
   --qr=substr(qr, 0, length(qr) - 1);
   qr=qr|| 'case when D.tc= D.pc then ''PASS'' else ''FAIL'' end as overall ';
   qr=qr || 'From (select *, Count(*) over (Partition By Scenario,Date) tc,'||
   ' count(*) filter (where Result=''PASS'') over (Partition By Scenario,Date) pc,'||
   '  Row_Number() Over (Partition By Scenario,Date Order By System) as sys_cat From run) D Where D.Scenario =' 
   || '''Proj1'' Group By D.Scenario,D.Date,overall Order By D.Scenario,D.Date';
   
Deallocate All;
EXECUTE qr;
End;
$body$

查看db<>fiddle的演示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM