我收到以下输出
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
代码和经理列不应该重复。它应该是空白的。
答案 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
答案 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}}。