首页 > 解决方案 > 如何在数据中的每个“类别”更改之间向我的 SQL 结果中添加一行?

问题描述

我使用 SQL Server 2019 生成一长串运输选项。该列表通过对包含列表项的表的简单查询产生,并显示在手持终端上。用户发现导航列表以找到正确的选项既麻烦又耗时,并且必须每天多次这样做。

我想要做的是在列表中添加一个带有几个破折号的类别名称,然后我将其显示在手持终端上。这将显示为某种“分页符”,这将使他们能够快速直观地浏览列表。

这里的挑战是终端软件非常基础,无法修改。它只能做一件事,即执行“GetList”存储过程并按顺序读取该过程中的每一行,以创建然后显示给用户的列表。

输出必须是一个不超过 64 个字符宽的 varchar 列,所以我能做的事情非常有限。

我可以修改存储过程使用的数据表和查询,并且我已经成功地添加了 CategoryRank 和 ColumnRank 列,并使用它们来更改列表的显示顺序,以便对用户更有意义。

例如,

当前查询:

  SELECT ListItem 
    FROM SymbolScanner.dbo.ShippingTypes WITH(NOLOCK))
ORDER BY CategoryRank,
         ColumnRank

ShippingTypes 表:

ListItem varchar(64) NOT NULL PRIMARY KEY CLUSTERED,
Category varchar(100) NOT NULL,
CategoryRank int NOT NULL,
ColumnRank int NOT NULL

样本数据(实际列表长达数百项):

ListItem                    Category    CategoryRank  ColumnRank
RM 1st Class No Tracking    Royal Mail  1             1
RM 1st Class Tracked        Royal Mail  1             2
RM 2nd Class No Tracking    Royal Mail  1             3
RM 2nd Class Tracked        Royal Mail  1             4
TNT 24 Hour Tracked         TNT         2             1
TNT 24 Hour No Tracking     TNT         2             2
TNT 48 Hour Tracked         TNT         2             3
TNT 48 Hour no Tracking     TNT         2             4
DHL 24 Hour Tracked         DHL         3             1
DHL 48 Hour Tracked         DHL         3             1

电流输出:

RM 1st Class No Tracking
RM 1st Class Tracked
RM 2nd Class No Tracking
RM 2nd Class Tracked
TNT 24 Hour Tracked
TNT 24 Hour No Tracking
TNT 48 Hour Tracked
TNT 48 Hour No Tracking
DHL 24 Hour Tracked
DHL 48 Hour Tracked

结果只是一个 varchars 列表,按照我希望它们排序的方式排序。这很好,但我想在每个类别之间添加一个包含类别名称的视觉中断,以便用户更容易快速向下滚动并查看类别何时更改。

期望的输出:

---- Royal Mail ----
RM 1st Class No Tracking
RM 1st Class Tracked
RM 2nd Class No Tracking
RM 2nd Class Tracked
---- TNT ----
TNT 24 Hour Tracked
TNT 24 Hour No Tracking
TNT 48 Hour Tracked
TNT 48 Hour No Tracking
---- DHL ----
DHL 24 Hour Tracked
DHL 48 Hour Tracked

所以我需要在我的结果中插入一个额外的行,其中包括类别名称和一些短划线字符,在每次更改类别之前。我敢肯定有一些 SQL 体操可以用来做这件事,我只是有点迷失在哪里开始。

标签: sqlsql-serverstored-procedures

解决方案


您可以在第二个查询中创建标题行并通过 UNIONing 合并结果:

SELECT ListItem FROM
(

SELECT ListItem, CategoryRank, ColumnRank
FROM ShippingTypes

UNION ALL

SELECT '---- ' + Category + ' ----', CategoryRank, 0
FROM ShippingTypes
GROUP BY Category, CategoryRank
) sub

ORDER BY CategoryRank,
     ColumnRank

看到这个 SQLFiddle


推荐阅读