SQL Server с не алфавитным значением в качестве имени столбца - PullRequest
4 голосов
/ 03 мая 2019

Я строю сводный запрос внутри 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

Также я попытался использовать это внутреннее утверждение 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  |

Я не могу запросить это.Может ли кто-нибудь помочь мне или предложить какую-либо другую идею для получения данных, используя вышеупомянутый запрос?

1 Ответ

6 голосов
/ 03 мая 2019

Вы должны обернуть идентификатор, который начинается с цифры с []:

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