Postgresql-列数可变的交叉表或数据透视

Postgresql-列数可变的交叉表或数据透视,sql,postgresql,Sql,Postgresql,我需要使用pivot或crosstab和columns变量进行查询。有可能吗? 我有下表: Data_Id ! Description_Column | Value --------+--------------------+------- 1 ! Column1 ! value1 1 ! Column2 ! value2 1 ! Column3 ! value3 1 ! Colu

我需要使用pivot或crosstab和columns变量进行查询。有可能吗? 我有下表:

Data_Id ! Description_Column | Value
--------+--------------------+-------
1       ! Column1            ! value1
1       ! Column2            ! value2 
1       ! Column3            ! value3
1       ! Column4            ! value4
2       ! Column1            ! value5
2       ! Column2            ! value6
2       ! Column3            ! value7
2       ! Column4            ! value8
我需要你的帮助

Data_Id ! Column1 ! Column2 ! Column3 ! Column4
1       ! value1  ! value2  ! value3  ! value4
2       ! value5  ! value6  ! value7  ! value8
Data_Id ! Column1 ! Column2 
3       ! value1  ! value2  
4       ! value5  ! value6  
但有时我会:

Data_Id ! Description_Column | Value
--------+--------------------+-------
3       ! Column1            ! value1
3       ! Column2            ! value2 
4       ! Column1            ! value5
4       ! Column2            ! value6
我需要你的帮助

Data_Id ! Column1 ! Column2 ! Column3 ! Column4
1       ! value1  ! value2  ! value3  ! value4
2       ! value5  ! value6  ! value7  ! value8
Data_Id ! Column1 ! Column2 
3       ! value1  ! value2  
4       ! value5  ! value6  
Obs。我需要的行将通过联接进行选择。所以我将得到变量列的数量


感谢您的帮助。

您必须记住,SQL planner需要在计划时知道返回行的大致情况。所以你不能直接这么做


首先,您可以创建一个函数,该函数执行您尝试执行的操作,并在refcursor中返回结果。这可能是最简单的方法。使用
tablefunc
contrib模块/扩展中的
crosstab()
函数。您应该能够根据查询数据生成要运行的SQL查询,但这需要函数中的动态SQL,而且您还必须返回一个refcursor。

这是一种SQL反模式。没有一句话能做到这一点。同样,如果你研究动态轴心,你会发现很多答案;编写SQL的代码。(对于x列,您需要不同于y列的SQL。因此,您需要为相应列数编写SQL的代码。)在大多数情况下,您应该将数据保持在原始的标准化形式。您可以在用户界面或其他处理层中对其进行透视,但我建议不要在SQL中进行透视。[如果我这样做,我将需要大约40个不同的查询。只使用了一个表来处理不同类型的数据。不是创建大约40个表,而是使用1个这种格式。您可能需要40个查询,但您可以编写一个查询来动态创建这些查询。没有一个查询可以做到这一点。我建议阅读l墨迹答案和其他答案。谢谢你们的帮助。我会读的。也许我会尝试在模型层适应这种情况。