-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 フィドルを試す

于 2012-04-11T10:39:05.403 に答える
1

この種の書式設定を行うには、Access や Crystal Reports などが必要です。プレーンSQLでは不可能です。

于 2012-04-11T10:17:24.560 に答える
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

それはSQLでは不可能です。データベースからデータを受け取った後、コードでデータを手動でループする必要があります。

編集

Vashh と Lieven のコメントの後、それが可能であることに気付きました。したがって、表示目的で必要な場合は、Func (Vaassh が提案)、null で結合 (Lieven による) を使用するか、ループして datagridview やテーブル、または使用したいものに追加することができます。

于 2012-04-11T10:11:05.257 に答える
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

For the fun of it, following is one way to do it but in the end, this is better done in the end-user application

;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

私の SQL*Plus は少しさびていますが、それがあなたが使用しているツールである場合、BREAKコマンドを使用するだけでかなり単純なはずです。

についてのコメントの 1 つで述べたように、これは実際の 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 に答える