-1

我有一个包含 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

无论如何不使用游标来做到这一点?谢谢。

4

2 回答 2

2
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 小提琴示例

于 2012-11-16T05:03:43.863 回答
0

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

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

当然,要获得准确的输出顺序,您可以省略某些列并将其设为 NULL,例如

  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 中挑选出来的标题。

于 2012-11-16T05:07:17.090 回答