sql-server - 使用非字母值作为列名的 SQL Server

标签 sql-server tsql common-table-expression

我正在 CTE 内构建一个数据透视查询。我有一个表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

我还尝试使用此内部案例声明:

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);

关于sql-server - 使用非字母值作为列名的 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55973548/

相关文章:

sql-server - 如何简化下面的SQL查询?

sql-server - ASP.NET 身份 2 到 3

.net - 如何编写 Visual Studio 数据库项目的部署脚本?

tsql - SQL UPDATE 将一列设置为另一个值并在同一步骤中更改值

sql - T-SQL "Dynamic"加入

sql-server - 将十六进制 varbinary 转换为其字符串表示形式?

sql-server - 使用 T-SQL 查询 XML 字段

sql-server - 当IDENTITY_INSERT设置为ON时,必须为表中的标识列指定显式值

sql - sql server中公用表表达式有什么好处

mysql - 如何在 MySQL 中使用 "WITH"子句?