首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于动态透视表列语句声明表变量

问基于动态透视表列语句声明表变量
EN

Stack Overflow用户
提问于 2021-01-28 16:17:10
回答 1查看 49关注 0票数 0

我想声明一个表变量,并用动态列填充它以执行join语句。

代码语言:javascript
复制
DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)
SELECT @cols = 
   STUFF((SELECT DISTINCT ',' + QUOTENAME(ColName)
   FROM [sbs].[ProposalAmounts]
   GROUP BY ColName, ProposalID
   FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @query = N'SELECT ProposalID, ' + @cols + N' from
   (select ProposalID, Amount, ColName from [sbs].[ProposalAmounts]) x
   PIVOT
   (MAX(Amount)for ColName in (' + @cols + N')) p '
EXEC sp_executesql @query;

这就是我到目前为止所做的事情,我对如何声明其中包含动态列的表变量感到困惑。

这是上面查询的结果:

​

​

这是我想要执行join语句的表的结果:

​

​

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-28 17:44:44

就像Jeroen Mostert评论的那样,你需要让一切都变得动态。

我建议将连接放在动态查询中。我使用的不是表变量,而是一个公用表表达式。

代码语言:javascript
复制
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);

SELECT @cols = 
   STUFF((SELECT DISTINCT N', ' + QUOTENAME([ColName])
          FROM [_tmp_].[ProposalAmounts]
          GROUP BY [ColName], [ProposalID]
          FOR XML PATH(N''), TYPE).value(N'.', N'NVARCHAR(MAX)'), 1, 2, N'')

SET @query = N'
WITH [CTE_Pivoted_ProposalAmounts] AS
(
  SELECT [ProposalID], ' + @cols + N'
  FROM
    (SELECT [ProposalID], [Amount], [ColName] FROM [sbs].[ProposalAmounts]) x
    PIVOT (MAX([Amount]) FOR [ColName] IN (' + @cols + N')) p
)
SELECT *
FROM
  [sbs].[OtherTable] ot
  INNER JOIN [CTE_Pivoted_ProposalAmounts] ppa ON ppa.[ProposalID] = ot.[ProposalID];
';

EXEC sp_executesql @query;

您需要将[sbs].[OtherTable]替换为要连接的表的实际名称。您还可以调整联接条件和SELECT子句中的字段。这里的代码只是一个简单的例子。我假设您会设法自己修复查询,使其行为符合您的期望。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65933320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档