我有如下示例数据,想看看在这种情况下是否可以使用交叉表函数。
样本数据:
ITEM | CD | TYPE |PARTS | PART | CNT |
Item 1 | A | AVG |2 | 1 | 10 |
Item 1 | A | AVG |2 | 2 | 20 |
Item 1 | B | AVG |2 | 1 | 10 |
Item 1 | B | AVG |2 | 2 | 20 |
Item 1 | A | SUM |2 | 1 | 10 |
Item 1 | A | SUM |2 | 2 | 20 |
Item 1 | B | SUM |2 | 1 | 10 |
Item 1 | B | SUM |2 | 2 | 20 |
预期结果:
ITEM | CD | AVG_1 | SUM_1 | AVG_2 | SUM_2 |
Item 1 | A | 10 | 10 | 20 | 20 |
Item 1 | B | 10 | 10 | 20 | 20 |
此外,如果部分为 3,则 A 和 B 代码的 AVG 和 SUM 将额外增加一行。这是动态的,用户可以输入此值。如何将多行展平?
在此要求中,项目 1 和代码 A 必须显示第 1 部分总和和平均值,然后显示第 2 部分总和和平均值,这可以根据部分列中的值进行更改。
感谢您对此的帮助!
以下查询产生了我需要的结果。但是,如果有超过 2 个部分(数据库列的一部分),则需要动态生成附加列 AVG3、SUM3。
我更喜欢使用过滤聚合而不是相当繁琐(在我看来)的
crosstab()
功能:我认为这也使添加新列更容易。
使用扩展中的官方(本机)
crosstab
函数tablefunc
来执行枢轴。尽管它有一个初始学习曲线,但从长远来看它会更好,因为它会为您的组织引入更少的技术债务和过度设计的解决方案。
参考
tablefunc
官方文档:https ://www.postgresql.org/docs/current/tablefunc.html