Postgresql-列数可变的交叉表或数据透视
我需要使用pivot或crosstab和columns变量进行查询。有可能吗? 我有下表:Postgresql-列数可变的交叉表或数据透视,sql,postgresql,Sql,Postgresql,我需要使用pivot或crosstab和columns变量进行查询。有可能吗? 我有下表: Data_Id ! Description_Column | Value --------+--------------------+------- 1 ! Column1 ! value1 1 ! Column2 ! value2 1 ! Column3 ! value3 1 ! Colu
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墨迹答案和其他答案。谢谢你们的帮助。我会读的。也许我会尝试在模型层适应这种情况。