我得到了一个包含 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 中选取的标题也很有用。