我的下面的查询成功返回结果,但是我想在结果中添加第二个标头:
DECLARE @cols AS NVARCHAR(MAX),
@SubHeader AS NVARCHAR(MAX)
@query AS NVARCHAR(MAX)
SELECT
@cols = STUFF((SELECT ',' + QUOTENAME(SP)
FROM #MyTable
WHERE SP != ''
GROUP BY SP
ORDER BY SP
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = 'SELECT ET,' + @cols + ' FROM
(SELECT ET, SP, ET
FROM #MyTable
WHERE SP != '''') x
PIVOT
(MAX(ET)
FOR SP IN (' + @cols + ')) p '
PRINT @query
EXECUTE(@query);
第二个标头来自上面声明的
@SubHeader
变量中的值。
或者,如果我们可以合并现有的标题和子标题并显示如下:
14-DEF, 15-GHI
目前结果如下所示:
我需要标题的输出如下:
已编辑 可以从使用上述查询提取数据的位置考虑以下模式:
declare @SampleData Table
(
ET varchar(30),
ProductId varchar(30),
PID varchar(20),
SP varchar(30),
EventT Time,
EventD Date
)
ET - 数字值:任何两位数字 PID - abc、def、geh
(这是本文所涉及的子标题值)SP -
这些是目前作为主标题的数字
EventT - 这是上面显示的结果中的第一列
其余我们不需要的字段。
该表中的记录如下所示:
如果您想要“标题=子标题”格式的列名称,那么下面是我的尝试。我对表格定义进行了一些更改,以便在实验时易于显示。如果有帮助请告诉我。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
DROP TABLE IF EXISTS #MyTable
Create table #MyTable
(
ET varchar(30),
PID varchar(20),
SP varchar(30),
EventT date
)
insert into #MyTable
VALUES
(2042, 'Ext', 14, '2023-01-01' ),
(null, 'Lac', 16, '2023-01-01' ),
(11, 'Moi', 17, '2023-01-01' ),
(11, 'Moi', 17, '2023-01-05' ),
(35, 'Moi', 18, '2023-01-05' )
SELECT
@cols = STUFF((SELECT ',' + QUOTENAME(PID+ '=' + SP)
FROM #MyTable
WHERE SP != ''
GROUP BY PID+ '=' + SP
ORDER BY PID+ '=' + SP
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @query = 'SELECT EventT,' + @cols + ' FROM
(SELECT ET, PID + ''='' + SP AS SP, EventT
FROM #MyTable
WHERE SP != '''') x
PIVOT
(MAX(ET)
FOR SP IN (' + @cols + ')) p '
PRINT @query
EXECUTE(@query);