使我的SQL查询动态化
我的表有一个ID int PK,然后是col1-col32字符串。“我的列”中的值与“时间”中的值也不相同。有时是10个,有时是全部,以此类推。我可以使这个SQL动态,这样我就不必用我的32列来填充它吗使我的SQL查询动态化,sql,sql-server,dynamic,Sql,Sql Server,Dynamic,我的表有一个ID int PK,然后是col1-col32字符串。“我的列”中的值与“时间”中的值也不相同。有时是10个,有时是全部,以此类推。我可以使这个SQL动态,这样我就不必用我的32列来填充它吗 WITH CTE AS ( SELECT * FROM ( SELECT ID, Column_Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER
WITH CTE
AS
(
SELECT *
FROM
(
SELECT ID,
Column_Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num,
val
FROM tPivot A
INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'tPivot' ) B
ON A.ID = B.ORDINAL_POSITION - 1
UNPIVOT
(
val for col in (col1,col2,col3,col4,col5)
) unpvt
) A
PIVOT
(
MAX(val) FOR column_name IN (col1,col2,col3,col4,col5)
) pvt
)
SELECT *
FROM
(
SELECT ID,
row_num,
coalesce(col1,col2,col3,col4,col5) val
FROM cte
) A
PIVOT
(
MAX(val) FOR ID IN ([1],[2],[3],[4],[5])
) pvt
太好了。
要为查询的枢轴部分构建ID,我指的是[1]、[2]、[3]、[4]、[5]使用:
现在您可以在动态sql中使用它:
该模型基于您在评论中提到的fiddle演示中的模式和您的查询
注意:也许您的原始查询可以更优化,我只是想说如何使其与所有idsrows的动态sql一起使用提供sql摆弄示例数据这就是它的样子,需要正确的部分也是动态的欢迎您,无法让它工作:什么问题?我不知道在哪里粘贴你的解决方案,在哪里做一些更改:it’很抱歉,我是个初学者。这是小提琴中的狂欢。正如我所说,这些值是动态的,每次都可能不同。好的,让我来复习一下it@user2210516,发生了什么事,我在等待反馈,如果不是这样的话,它对你不起作用。我得走了。
DECLARE @IDP AS NVARCHAR(MAX)
SELECT @IDP = STUFF((SELECT ',' + QUOTENAME(ID)
from (select distinct row_num as ID from CTE) q
group by q.ID
order by q.ID
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
DECLARE @sql AS NVARCHAR(MAX)
SET @sql='
WITH CTE
AS
(
SELECT *
FROM
(
SELECT ID,
Column_Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY col) row_num,
val
FROM tPivot A
INNER JOIN (SELECT Column_Name AS COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''tPivot'' ) B
ON A.ID = B.ORDINAL_POSITION - 1
UNPIVOT
(
val for col in (col1,col2,col3,col4,col5)
) unpvt
) A
PIVOT
(
MAX(val) FOR column_name IN (col1,col2,col3,col4,col5)
) pvt
)
SELECT *
FROM
(
SELECT ID,
row_num,
coalesce(col1,col2,col3,col4,col5) val
FROM cte
) A
PIVOT
(
MAX(val) FOR ID IN ('+@IDP+')
) pvt'
EXEC(@sql)