我有一个包含以下列和值的表
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排序数据
提前致谢
答案 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的设计目的”