元素数超过 SQL 数据透视语句中允许的最大值

Posted

技术标签:

【中文标题】元素数超过 SQL 数据透视语句中允许的最大值【英文标题】:Number of elements exceeds the maximum allowed in SQL pivot statement 【发布时间】:2019-07-05 15:46:36 【问题描述】:

我在尝试将日期值转换为“Mmm YY”格式然后将它们列为查询结果中的列时遇到问题。我找到了一个 pivot 命令的示例,因为我不理解它,所以我做错了,因为我收到错误消息:“选择列表中的元素数量超过了 4096 个元素的最大允许数量。”但我知道我正在查看的数据少于 4096 个月(5 年而不是 341 年)所以我知道错误是我的代码并怀疑它与我的分组有关。请帮忙!

我在 MSSMS 14.0.17289.0 中运行它,并尝试在它自己的嵌套选择语句中运行代码。它在将日期结果作为列返回时有效,因此我认为该位是正确的,但还不够了解,无法确定其余部分的问题。

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 Account、Branch、Amount、1 月 17 日、2 月 17 日、3 月 17 日、4 月 17 日...等列为包含内容的列标题。目前日期存在于标题“发布日期”下的列中。

【问题讨论】:

【参考方案1】:

我看到几个错误。

首先,您没有收集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 @colsselect @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 变量的输出将使您看到导致错误的查询。下次您发布问题时,看到它会非常有帮助。

【讨论】:

以上是关于元素数超过 SQL 数据透视语句中允许的最大值的主要内容,如果未能解决你的问题,请参考以下文章

C 中允许的静态数组的最大大小是多少?

如何解决需要比 SQL 中允许的更长的列名?

如何限制文本框中允许的字符数?

javascript 变量中允许的最大整数是多少? [复制]

限制表单输入文本字段中允许的字符数

如何将文本字段中允许的最大输入值限制为 10? [复制]