合并SQL中的公共行

时间:2012-04-11 10:06:55

标签: sql oracle

我收到以下输出

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

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

8 个答案:

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

答案 1 :(得分:1)

您需要使用Access或Crystal Reports之类的东西来执行此类格式化。它在纯SQL中是不可能的。

答案 2 :(得分:0)

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

修改

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

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

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

答案 5 :(得分: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)

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

答案 7 :(得分:0)

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

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

BREAK on code on manager

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

请注意,我的SQL * Plus有点生疏,所以这可能无法正常工作,但可以找到BREAK命令的详细信息{。{3}}。