Oracle SQL动态枢轴表:应对变化值
在Oracle SQL中使用PIVOT函数时,处理IN
语句中的动态值可能很棘手。本文提供一种解决方案。
Oracle的PIVOT通常需要IN
语句中使用静态值字符串,例如:
<code class="language-sql">... pivot (sum(A) for B in (X)) </code>
但是,如果B的值存储在数据库列中并定期更新,则手动更新字符串X变得不切实际。
为了解决这个问题,我们可以使用一个技巧,它涉及创建IN
字符串,然后在PIVOT查询中使用它。让我们分解一下:
步骤1:构建IN字符串
为了创建字符串,我们使用COLUMN NEW_VALUE
和LISTAGG
函数,如下所示:
<code class="language-sql">COLUMN temp_in_statement new_value str_in_statement SELECT DISTINCT LISTAGG('''' || myLetter || ''' AS ' || myLetter,',') WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement FROM (SELECT DISTINCT myLetter FROM myTable);</code>
此查询构建一个类似于以下内容的字符串:
<code>'A' AS A,'B' AS B,'C' AS C</code>
步骤2:在PIVOT中使用字符串
现在,我们可以将此字符串添加到我们的PIVOT查询中:
<code class="language-sql">SELECT * FROM (SELECT myNumber, myLetter, myValue FROM myTable) PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));</code>
限制:
虽然此方法提供了一种解决方案,但它有一个限制:连接字符串的最大长度为4000字节。因此,如果B的值数量非常多,则此方法可能不适用。
以上是如何在 Oracle SQL 中使用不同的值执行动态透视?的详细内容。更多信息请关注PHP中文网其他相关文章!