SQL Server 多列表转置
表转置是指将行转换为列,列转换为行。当您需要透视数据以进行分析或演示时,这尤其有用。
问题:
您想转置一个包含多列的表,将其从以下格式:
Day | A | B |
---|---|---|
Mon | 1 | 2 |
Tue | 3 | 4 |
Wed | 5 | 6 |
Thu | 7 | 8 |
Fri | 9 | 0 |
转换为以下格式:
Value | Mon | Tue | Wed | Thu | Fri |
---|---|---|---|---|---|
A | 1 | 3 | 5 | 7 | 9 |
B | 2 | 4 | 6 | 8 | 0 |
解决方案:
要在 SQL 中转置多列表,您可以结合使用 UNPIVOT 和 PIVOT 函数。
1. UNPIVOT:
UNPIVOT 函数通过将列转换为行来反规范化数据。这将创建一个包含三列的新表:day、col 和 value。
<code class="language-sql">select day, col, value from yourtable unpivot ( value for col in (A, B) ) unpiv</code>
2. PIVOT:
然后,PIVOT 函数通过将 day 值转换为列来重新规范化数据。这将生成转置后的表。
<code class="language-sql">select * from ( select day, col, value from yourtable unpivot ( value for col in (A, B) ) unpiv ) src pivot ( max(value) for day in (Mon, Tue, Wed, Thu, Fri) ) piv</code>
注意:
应用于您的查询:
要转置您的特定查询,您可以使用以下修改后的代码:
<code class="language-sql">select * from ( select LEFT(datename(dw,datetime),3) as DateWeek, col, value from DataTable cross apply ( values ('A', ACalls), ('B', BCalls) ) c (col, value) ) src pivot ( sum(value) for dateweek in (Mon, Tue, Wed, Thu, Fri) ) piv</code>
这将生成所需格式的转置表。
以上是如何在 SQL 中转置多列表?的详细内容。更多信息请关注PHP中文网其他相关文章!