SQL 列名称为非字母值的服务器

SQL Server with non-alphabetic value as column name

我正在 CTE 中构建数据透视查询。我有一个 table Table_1:

Store      Count     xCount
-------    ----     ------
101        1        138
109        1        59
101        2        282
109        2        97
105        3        60
109        3        87
105        4.a      60
109        4.b      87

在Table_1中,列计数的数据类型为varchar(10)。

我使用动态数据透视查询来进行数据透视 Table_1

DECLARE @DynamicCol AS NVARCHAR(MAX),
        @SQL  AS NVARCHAR(MAX)

select @DynamicCol = STUFF((SELECT distinct ',' + QUOTENAME(count) 
                    from table_1
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)') 
                    ,1,1,'')

set @SQL = ';WITH CTE as (
            SELECT store,' + @DynamicCol + ' from 
             (
               select * from table_1
            ) res
            pivot 
            (
               MAX(xCount)
                for Count in (' + @DynamicCol + ')
            ) piv ) SELECT * 
FROM CTE where 4.a is null'

execute(@SQL);

并得到结果为:

| STORE |   1 |   2 |   3 | 4.a |
+-------+-----+-----+-----+-----+
|   101 | 138 | 282 | null| null|
|   105 | null| null|  60 | 60  |
|   109 |  59 |  97 |  87 | 87  |

现在,我尝试从第 3 列和 4.a 获取数据,其中 3 和 4.a 为空。 我为获取数据而构建的查询是

 Select * from CTE where 3 is null
 Select * from CTE where 4.a is null

我还尝试将此内部 case 语句用作:

Select *,case when (3 is null) then 'some result' else '' end from CTE 

在每个查询中,我都没有得到查询返回的任何值。 我尝试在每个旋转列中附加 'X' 并删除“。”来自 anme 列,列名看起来像

| STORE |  X1 |  X2 |  X3 | X4a |
+-------+-----+-----+-----+-----+
|   101 | 138 | 282 | null| null|
|   105 | null| null|  60 | 60  |
|   109 |  59 |  97 |  87 | 87  |

我无法查询这个。谁能帮助我或建议我使用上述查询获取数据的任何其他想法?

你必须用[]包裹以数字开头的标识符:

DECLARE @DynamicCol AS NVARCHAR(MAX),
        @SQL  AS NVARCHAR(MAX)

select @DynamicCol = STUFF((SELECT distinct ',' + QUOTENAME(count) 
                    from table_1
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)') 
                    ,1,1,'')

set @SQL = ';WITH CTE as (
            SELECT store,' + @DynamicCol + ' from 
             (
               select * from table_1
            ) res
            pivot 
            (
               MAX(xCount)
                for Count in (' + @DynamicCol + ')
            ) piv ) SELECT * 
FROM CTE where [4.a] is null'  -- here

execute(@SQL);