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

时间:2019-07-05 15:46:36

标签: sql pivot transpose

尝试将日期值转换为“ 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日...等列为包含内容的列标题。目前,日期存在于标题“过帐日期”下的列中。

1 个答案:

答案 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 @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变量的输出将使您看到引起错误的查询。下次您发布问题时,看到它会很有帮助。