-1

我得到以下输出

Code  Manager    Employee
1      A          Emp1
1      A          Emp2   
1      A          Emp3  
2      B          Emp4
2      B          Emp5

但我希望结果为

Code   Manager    Employee
1       A          Emp1
                   Emp2
                   Emp3
2       B          Emp4
                   Emp5

代码和管理器列不应重复。它应该是空白的。

4

8 回答 8

2
select case when Code = lag(Code) over(order by Code, Manager, Employee)
         then null
         else Code
       end as Code,
       case when Manager = lag(Manager) over(order by Code, Manager, Employee)
         then null
         else Manager
       end as Manager,
       Employee
from YourTable Y
order by Y.Code, Y.Manager, Y.Employee

试试SQL Fiddle

于 2012-04-11T10:39:05.403 回答
1

您需要 Access 或 Crystal Reports 之类的东西来执行这种格式设置。在纯 SQL 中是不可能的。

于 2012-04-11T10:17:24.560 回答
0

SQL 无法做到这一点。从数据库接收数据后,您应该在代码中手动循环数据。

编辑

在 Vashh 和 Lieven 发表评论后,我意识到这是可能的。因此,如果他需要用于显示目的,他可以使用 Func(由 Vaassh 建议)、使用 null 加入(由 Lieven 提供)或者可能是循环并添加到 datagridview 或 table 或任何他想使用的东西。

于 2012-04-11T10:11:05.257 回答
0

为了它的乐趣,以下是一种方法,但最后,最好在最终用户应用程序中完成

;WITH YourTable (Code, Manager, Employee) AS(
    SELECT * FROM (VALUES 
        (1, 'A', 'Emp1')
        , (1, 'A', 'Emp2')
        , (1, 'A', 'Emp3')
        , (2, 'B', 'Emp4')
        , (2, 'B', 'Emp5')
    ) a (b, c, d)       
)
, q AS (
    SELECT  rn = ROW_NUMBER() OVER (ORDER BY Code, Manager, Employee), *
    FROM    YourTable
)
SELECT  Code = CASE WHEN q1.Code = q2.Code THEN NULL ELSE q1.Code END
        , Manager = CASE WHEN q1.Code = q2.Code THEN NULL ELSE q1.Manager END
        , q1.Employee
FROM    q q1
        LEFT OUTER JOIN q q2 ON q1.rn = q2.rn + 1
于 2012-04-11T10:24:14.663 回答
0

我知道您在 Oracle 中寻求答案,但也许这个 SQL Server 示例会对您有所帮助(如果您真的非常需要这样做,而不是在报告环境中):

DECLARE @TBL TABLE(
  Code     INT,
  Manager  CHAR(1),
  Employee VARCHAR(4))

INSERT @TBL VALUES (1,'A','Emp1')
INSERT @TBL VALUES (1,'A','Emp2')
INSERT @TBL VALUES (1,'A','Emp3')
INSERT @TBL VALUES (2,'B','Emp4')
INSERT @TBL VALUES (2,'B','Emp5')

;WITH cte
     AS (SELECT Code
                ,Manager
                ,Employee
                ,ROW_NUMBER() OVER(ORDER BY Code) rownum
         FROM   @TBL)
SELECT CASE curr.Code
         WHEN prev.Code THEN ''
         ELSE CAST(curr.Code AS VARCHAR(20))
       END AS _Code
       ,CASE curr.Manager
          WHEN prev.Manager THEN ''
          ELSE curr.Manager
        END AS _Manager
       ,curr.Employee
FROM   cte curr
       LEFT JOIN cte prev
         ON curr.rownum = prev.rownum + 1
于 2012-04-11T10:26:23.857 回答
0

如果您只是使用 SQL Server 2005/2008,则可以通过以下方式实现此目的。

declare @table table (
Code int,
Manager Varchar(1),
Employee varchar(10)
)

insert into @table values
(1,'A','Emp1'),
(1,'A','Emp2'),
(1,'A','Emp3'),
(2,'A','Emp4'),
(2,'A','Emp5')

select * from @table
select
case when number=1 then Code else null end as Code,
case when number=1 then Manager else null end as Manager,
employee
from (
select *,
row_number() over (partition by code, manager order by code,manager) as number
from @table
) x

这会给你:

(5 row(s) affected)
Code        Manager Employee
----------- ------- ----------
1           A       Emp1
1           A       Emp2
1           A       Emp3
2           A       Emp4
2           A       Emp5

(5 row(s) affected)

Code        Manager employee
----------- ------- ----------
1           A       Emp1
NULL        NULL    Emp2
NULL        NULL    Emp3
2           A       Emp4
NULL        NULL    Emp5

(5 row(s) affected)
于 2012-04-11T10:27:25.190 回答
0

完毕:)

如果您愿意,可以将 NULL 值更改为 ''。

WITH 
CTE1 AS (
SELECT DISTINCT [Code], [Manager], 
(   SELECT TOP 1 Employee 
    FROM [dbo].[table] t2 
    WHERE t1.Code = t2.Code AND t1.Manager = t2.Manager 
    ORDER BY Employee) AS [Employee]
FROM [dbo].[table] t1)
,
CTE2 AS (
        SELECT * FROM [dbo].[table]
        EXCEPT
        SELECT * FROM CTE1)

SELECT * FROM CTE1
UNION
SELECT NULL as Code, NULL as Manager, Employee
FROM CTE2
ORDER BY Employee
于 2012-04-11T10:32:20.553 回答
0

我的 SQL*Plus 有点生疏,但如果这是您正在使用的工具,那么它应该相当简单,但使用BREAK命令。

正如其中一条评论中提到的那样,最好将这留给您的报告工具,而不是在实际的 SQL 中执行,因为没有所有值的单个行在结果集的上下文之外没有任何意义。

BREAK on code on manager

SELECT code, manager, employee
FROM yourTable y
order by code, manager;

请不要说我的 SQL*Plus 有点生锈,所以这可能无法完全正常工作,但BREAK可以在 Oracle 文档中找到该命令的详细信息。

于 2012-04-11T15:24:00.087 回答