在行组之间插入空行,并在sql中按ID排序

时间:2011-09-22 15:17:10

标签: sql

我有一个包含以下列和值的表

ID       TYPE     NAME
1      MAJOR      RAM
2      MAJOR      SHYAM
3      MAJOR      BHOLE
4      MAJOR      NATHA
5      MINOR      JOHN
6      MINOR      SMITH

我的要求是修改一个存储过程(或SQL查询),该存储过程将返回相同的结果集,只是在TYPE从一种类型更改为另一种类型(主要,次要)后会出现空行。

MAJOR      RAM
MAJOR      SHYAM
MAJOR      BHOLE
MAJOR      NATHA

MINOR      JOHN
MINOR      SMITH

虽然我使用此查询添加空白行,但未按ID

进行排序
select TYPE, NAME from (
select
TYPE as P1,
1 as P2,
ID,
TYPE,
NAME
from EMP
union all
select distinct
TYPE,
2,
'',
'',
N''
from EMP
) Report
order by P1, P2
go

我如何按ID排序数据

提前致谢

2 个答案:

答案 0 :(得分:12)

是的,是的,不要这样做,但这是查询,假设SQL Server 2008 R2。其他版本/ rdbms可以通过编写两个单独的查询来实现相同的功能。

查询

; WITH DEMO (id, [type], [name]) AS
(
SELECT 1,'MAJOR','RAM'
UNION ALL SELECT 2,'MAJOR','SHYAM'
UNION ALL SELECT 3,'MAJOR','BHOLE'
UNION ALL SELECT 4,'MAJOR','NATHA'
UNION ALL SELECT 5,'MINOR','JOHN'
UNION ALL SELECT 6,'MINOR','SMITH'   
)
, GROUPED AS
(
    SELECT
        D.[type]
    ,   D.[name]
    ,   ROW_NUMBER() OVER (ORDER BY D.[type] ASC, D.[name] DESC) AS order_key
    FROM
        DEMO D
    GROUP BY
    --grouping sets introduced with SQL Server 2008 R2
    -- http://msdn.microsoft.com/en-us/library/bb510427.aspx
    GROUPING SETS
    (
        [type]
    ,   ([type], [name])
    )
)
SELECT
    CASE WHEN G.[name] IS NULL THEN NULL ELSE G.[type] END AS [type]
,   G.[name]
FROM 
    GROUPED G
ORDER BY
    G.order_key

结果

如果您不喜欢空值,请使用coalsece制作空字符串

type    name
MAJOR   SHYAM
MAJOR   RAM
MAJOR   NATHA
MAJOR   BHOLE
NULL    NULL
MINOR   SMITH
MINOR   JOHN
NULL    NULL

答案 1 :(得分:0)

我同意billinkc。 在顺序的头脑中,像我一样,它可能会发生不同。 方法是使用游标并将记录插入临时表。 这个表可以有一个INT类型的列,假设它被称为“POSITION”,它随着每个插入而递增。 检查ID更改,并在每次更改时添加空行。 最后通过“POSITION”生成SELECT顺序。

我的背景是: 一个界面可以根据用户的需要进行动态调整,其中一个屏幕显示了一个支付表,按提供商的分组提供了早期提到的方法。 我决定从数据库管理这个并跳过客户端屏幕的维护,因为每个提供商都有不同的付款条件。

希望这会有所帮助,让我们保持开放的心态,避免说“不要这样做”或“这不是SQL的设计目的”