我正在 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/