我正在尝试做一个动态 sql 查询,类似于这个论坛上出现的一些查询,但是对于我的生活,我无法让它工作。
我正在使用 SQL Server 2008。我有一个包含一系列 order_ref 编号的表。这些数字中的每一个都有与其相关联的不同数量的advice_refs。advice_ref 编号是唯一的(它们是来自另一个表的键)。每个order_ref 至少有一个advice_ref。有一堆列描述了每个advice_ref 的信息。
我想要做的是创建一个表,其中每个唯一的 order_ref 有一行,每个advice_ref 的列按升序排列。列将是 Advice01、Advice02、....Advice10、Advice11 等。并非所有 Advice# 列都会为每个 order_ref 填写,advice# 列的数量取决于具有最大数量的advice_refs 的 order_ref。
该表如下所示:
Order Advice01 Advice02 Advice03 Advice04.....
1 1 2 3
2 5 8 9 20
3 25
我尝试使用的代码是:
DECLARE @SQL NVARCHAR(MAX)
DECLARE @PVT NVARCHAR(MAX)
SELECT @SQL = @SQL + ', COALESCE(' + QUOTENAME('Advice' + RowNum) + ', '''') AS ' + QUOTENAME('Advice' + RowNum),
@PVT = @PVT + ', ' + QUOTENAME('Advice' + RowNum)
FROM (SELECT case when RowNum2 < 10 then '0'+RowNum2 when RowNum2 >=10 then RowNum2 end [RowNum] From
( SELECT DISTINCT CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref)) [RowNum2]
FROM [ED_dups].[dbo].[NewEDDupsLongForm]
) rn2 ) rn
SET @SQL = 'SELECT order_ref' + @SQL + '
FROM ( SELECT order_ref,
advice_ref,
case when CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref)) < 10
then ''Advice0'' + CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref))
else ''Advice'' + CONVERT(VARCHAR, ROW_NUMBER() OVER(PARTITION BY order_ref ORDER BY advice_ref))
end [AdviceID]
FROM [ED_dups].[dbo].[NewEDDupsLongForm]
) data
PIVOT
( MAX(advice_ref)
FOR AdviceID IN (' + STUFF(@PVT, 1, 2, '') + ')
) pvt'
EXECUTE SP_EXECUTESQL @SQL
SQL 服务器告诉我查询执行成功,但没有输出。当我运行代码片段时,似乎问题在于靠近的枢轴语句
+ STUFF(@PVT, 1, 2, '') + ')
和/或靠近的选择语句
''Advice0'' +
提前感谢您的帮助——我已经在这几天了!