在动态查询结果中插入一行作为第一行

问题描述 投票:0回答:1

我的下面的查询成功返回结果,但是我想在结果中添加第二个标头:

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 - 这是上面显示的结果中的第一列

其余我们不需要的字段。

该表中的记录如下所示:

sql sql-server sql-server-2012 pivot dynamicquery
1个回答
0
投票

如果您想要“标题=子标题”格式的列名称,那么下面是我的尝试。我对表格定义进行了一些更改,以便在实验时易于显示。如果有帮助请告诉我。

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);
© www.soinside.com 2019 - 2024. All rights reserved.