【发布时间】:2020-06-16 06:00:59
【问题描述】:
【问题讨论】:
标签: sql sql-server tsql pivot
【问题讨论】:
标签: sql sql-server tsql pivot
您可以通过从字符串变量执行 SQL 语句来使用某种动态查询
概念大致如下:
首先,声明变量
DECLARE @pivotcolumns NVARCHAR(MAX) = '',
@sqlquery NVARCHAR(MAX) = '';
获取所有 mode_code 并将它们存储到变量 @pivotcolumns
SELECT
@pivotcolumns+=QUOTENAME(mode_code) + ','
FROM
the_table
ORDER BY
mode_code;
SET @pivotcolumns = LEFT(@pivotcolumns, LEN(@pivotcolumns) - 1);
如果我们打印@pivotcolumns,它将变成'0','1','2','...'
得到所有列后,将它们解析成一个字符串用于SQL查询
SET @sqlquery ='
SELECT * FROM (
select mode_code, time_spent
from the_table) t
PIVOT(
SUM(time_spent)
FOR mode_code IN ('+ @pivotcolumns +')
) AS pivot_table;';
当你完成了一个 SQL 查询字符串之后,我们可以使用 sp execute SQL 来执行它
EXECUTE sp_executesql @sqlquery;
【讨论】:
SELECT @Column += ....) 是 undocumented and unreliable。它并不总是按预期工作。您应该使用STRING_AGG(如果使用支持它的版本),或者使用XML Extensions 将行连接成一个变量