使用 SQL 服务器在 CTE 中自动生成列名
Automatically generate columns name in CTE using SQL Server
我正在 CTE 中构建数据透视查询。我有一个 table 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 |
结果还好,现在又多了一个WEEK。
我想开发一个带有数据透视查询的 CTE,它将自动生成不同的周并在此基础上创建一个列。
我做了一些研究,发现可以使用递归 CTE 来执行此操作。我是递归 CTE 的新手,所以请任何人帮助我解决这个问题。
我也尝试过动态数据透视查询,但 CTE 不允许动态查询。
请帮忙。
dynamic pivot doesn't work inside 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)
Can i use recursive CTE?
不,这不是递归 CTE 的合适用例。
/* 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)
我正在 CTE 中构建数据透视查询。我有一个 table 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 |
结果还好,现在又多了一个WEEK。
我想开发一个带有数据透视查询的 CTE,它将自动生成不同的周并在此基础上创建一个列。
我做了一些研究,发现可以使用递归 CTE 来执行此操作。我是递归 CTE 的新手,所以请任何人帮助我解决这个问题。
我也尝试过动态数据透视查询,但 CTE 不允许动态查询。
请帮忙。
dynamic pivot doesn't work inside 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)
Can i use recursive CTE?
不,这不是递归 CTE 的合适用例。
/* 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)