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

时间:2012-11-16 04:59:30

标签: sql-server sql-server-2008 tsql

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

无论如何不使用游标进行此操作? 感谢。

2 个答案:

答案 0 :(得分: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 Fiddle example

答案 1 :(得分: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;

当然,要获得您的EXACT输出订单,您可以省略和取消某些列,例如。

  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中挑选的标题也很有用。