尝试将日期值转换为“ MM YY”格式,然后将其列为查询结果中的列时遇到问题。我找到了数据透视命令的示例,并且由于我不理解它,所以在收到错误消息时做错了一些事情:“选择列表中的元素数超过了允许的最大4096个元素数。”但我知道要查看的数据少于4096个月(5年而不是341个月),所以我知道错误是我的代码,并且怀疑这与我的分组有关。请帮忙!
我正在MSSMS 14.0.17289.0中运行此程序,并尝试自行运行嵌套的select语句中的代码。当将日期结果作为一列返回时,它可以工作,所以我认为这是对的,但对于了解其余问题还不够了解。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME('PDate')
FROM [Live Company$G_L Entry] AS GLE
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
GLE.[G_L Account No_]
,CASE WHEN GLE.[Global Dimension 1 Code] IS NOT NULL THEN GLE.[Global Dimension 1 Code] ELSE 00 END AS "Branch"
,CAST(SUM(GLE.[Amount]) AS DECIMAL(18,2)) AS ''Amount''
,FORMAT(GLE.[Posting Date],''MMM yy'') as ''PDate''
FROM [Live Company$G_L Entry] AS GLE
GROUP BY GLE.[G_L Account No_],GLE.[Global Dimension 1 Code],GLE.[Pdate]
) x
pivot
(
max(value)
for PDate in (' + @cols + N')
) p '
exec sp_executesql @query;
我希望输出将G_L帐户,分支机构,金额,1月17日,2月17日,3月17日,4月17日...等列为包含内容的列标题。目前,日期存在于标题“过帐日期”下的列中。
答案 0 :(得分:0)
我看到几个错误。
首先,您不是以MMM yyy
格式收集列名。实际上,在撰写本文时,您是在串联一系列字符串文字PName
。
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(FORMAT(GLE.[Posting Date],'MMM yy'))
FROM [Live Company$G_L Entry] AS GLE
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
要在以后进行调试,您需要使用print @cols
或select @cols
来查看它是否正确。
主查询本身还有其他问题。
set @query = N'SELECT [G_L Account No_], Branch' -- presumably you want to see these too
+ @cols + N' from
(select -- <-- missing from your query
GLE.[G_L Account No_]
,COALESCE(GLE.[Global Dimension 1 Code], 00) AS "Branch"
,CAST(SUM(GLE.[Amount]) AS DECIMAL(18,2)) AS Amount
,FORMAT(GLE.[Posting Date],'MMM yy') as PDate
FROM [Live Company$G_L Entry] AS GLE
GROUP BY GLE.[G_L Account No_],GLE.[Global Dimension 1 Code],
FORMAT(GLE.[Posting Date],'MMM yy') -- <-- correct grouping expression
) x
同样,转储@query
变量的输出将使您看到引起错误的查询。下次您发布问题时,看到它会很有帮助。