在不使用游标的情况下将类别放入表行中



我得到了一个包含 3 列的表:

NameColumn  CategoryColumn  QuantityColumn
Name1       Category1   5
Name2       Category1   8
Name3       Category1   10
Name4       Category2   3
Name5       Category2   15
Name6       Category2   7

我需要编写一个查询来将上述数据转换为以下结果集:

NameColumn  CategoryColumn  QuantityColumn
Category1   NULL        NULL
Name1       NULL        5
Name2       NULL        8
Name3       NULL        10
Category2   NULL        NULL
Name4       NULL        3
Name5       NULL        15
Name6       NULL        7

无论如何可以在不使用游标的情况下执行此操作?谢谢。

SELECT NameColumn, CategoryColumn, QuantityColumn
FROM
(
    SELECT CategoryColumn AS NameColumn, NULL AS CategoryColumn, NULL AS QuantityColumn,
        CategoryColumn AS _cat, 1 AS _iscat
    FROM myTable
    GROUP BY CategoryColumn
    UNION ALL
    SELECT NameColumn, NULL AS CategoryColumn, QuantityColumn, 
        CategoryColumn AS _cat, 0 AS _iscat
    FROM myTable
) x
ORDER BY _cat, _iscat DESC

SQL 小提琴示例

可以,但除非将元数据列添加到输出中,否则它不会有太大用处。

  select NameColumn, CategoryColumn, QuantityColumn, 0 IsCategory
    from tbl
   union all
  select distinct CategoryColumn, CategoryColumn, null, 1
    from tbl
order by CategoryColumn, IsCategory desc, NameColumn;

当然,要获得确切的输出顺序,您可以省略并取消某些列,例如

  select NameColumn, NULL as CategoryColumn, QuantityColumn
    from (
  select NameColumn, CategoryColumn, QuantityColumn, 0 IsCategory
    from tbl
   union all
  select distinct CategoryColumn, CategoryColumn, null, 1
    from tbl
         ) X
order by X.CategoryColumn, IsCategory desc, NameColumn;

但是,如果您打算在 SQL Server 外部使用数据,则需要保留元数据,以便将名称和类别与其来源的原始类别相关联。IsCategory 对于标识从 CategoryColumn 中选取的标题也很有用。

最新更新