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

Insert a row as first row in the result of a dynamic query

提问人:RKh 提问时间:9/27/2023 最后编辑:RKh 更新时间:9/29/2023 访问量:67

问:

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

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

目前的结果如下图所示:

enter image description here

我需要如下标题的输出:

enter image description here

编辑可以使用上述查询从中提取数据的位置考虑以下架构:

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

其余我们不需要的其他字段。

此表中的记录如下所示:

enter image description here

sql-server sql-server-2012 透视 dynamicquery

评论

2赞 Thom A 9/27/2023
这是表示层的任务,而不是 SQL 层的任务。使用 SSRS 和矩阵之类的内容,或者,如果要在公司应用程序中显示,请在将应用程序代码中的数据呈现给用户之前对其进行透视。
0赞 RKh 9/27/2023
@ThomA 无法使用 SSRS。我可以在 C# 中做到这一点,但只是在想我们是否至少可以得到一个连接的标头。
1赞 Thom A 9/27/2023
SSRS 只是一个例子,我评论的关键部分是它应该由表示层来做这项工作;你没有提到问题中的内容,所以我不能进一步评论。
0赞 topsail 9/27/2023
第二个映像不是 SQL。它显示了一个“表”,前两行有三列,第三行有四列。这是不行的。
2赞 3N1GM4 9/27/2023
如果你真的想按照你提出的方式解决这个问题(尽管评论中另有有效的建议),那么我们需要查看 DDL 和一些示例数据,以便该表能够回答。#MyTable

答:

1赞 Nandalal Seth 9/29/2023 #1

如果您想要“Header=Subheader”格式的列名,那么下面是我的想法。我稍微更改了表定义,以便在试验时轻松显示。如果有帮助,请告诉我。

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

评论

0赞 RKh 10/4/2023
让我试试这个。