Автоматически генерировать имя столбца в CTE с использованием SQL Server - PullRequest
0 голосов
/ 02 мая 2019

Я строю сводный запрос внутри CTE.У меня есть таблица Table_1:

Store      Week     xCount
-------    ----     ------
101        1        138
105        1        37
109        1        59
101        2        282
109        2        97
105        3        60
109        3        87

Это запрос, который я использовал для поворота Table_1:

with CTE as 
(
    select 
        *
    from 
        (select 
             store, week, xCount
         from 
             table_1) src
    pivot
        (sum(xcount)
             for week in ([1], [2], [3])
    ) piv;
)
Select * 
From CTE

И вот результат, который я получил:

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

Результат в порядке, но теперь добавлена ​​еще одна НЕДЕЛЯ.

Я хочу разработать CTE с сводным запросом, который будет автоматически генерировать отдельные недели, и создать столбец на этой основе.

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

Я также пробовал динамический сводный запрос, но CTE не разрешает динамический запрос.

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

динамический поворот не работает внутри CTE

Нет, но CTE работает внутри динамического запроса:

{assuming you have declared the variables used below}
SELECT @Cols = {query to get the column names in a comma-separated string}

SET @sql='
with CTE as 
(
    select 
        *
    from 
        (select 
             store, week, xCount
         from 
             table_1) src
    pivot
        (sum(xcount)
             for week in ('+@Cols+')
    ) piv;
)
Select * 
From CTE
'

EXEC (@sql)

Могу ли я использовать рекурсивныйCTE?

Нет, это не подходящий вариант использования для рекурсивного CTE.

1 голос
/ 02 мая 2019
/* Variable to hold unique Week to be used in PIVOT clause */
DECLARE @Weeks  NVARCHAR(MAX) = N''
/* Extract unique Week names with pivot formattings */
SELECT @Weeks  = @Weeks  + ', [' + COALESCE(week, '') + ']'
FROM (SELECT DISTINCT week FROM table_1) DT
/* Remove first comma and space */
SELECT @Weeks = LTRIM(STUFF(@Weeks , 1, 1, ''))


/* Variable to hold t-sql query */
DECLARE @CTEStatement NVARCHAR(MAX) = N''
/* Generate dynamic PIVOT query here */
SET @CTEStatement=N'
;WITH CTE as 
( SELECT *
    FROM 
        (SELECT
             store
            ,week
            ,xCount
         FROM 
             table_1) SRC
    PIVOT
        (SUM(xcount)
             FOR week in ('+ @Weeks +')
    ) PIV;
)
SELECT * 
FROM CTE
'

EXEC (@CTEStatement)
...