2016-05-18 16 views
4

SQL FIDDLE DEMO HERESQL Serverの列に行の値を表示するにはどうすればよいですか?

私はSheduleWorkersテーブルについては、この表の構造を持っている:

CREATE TABLE SheduleWorkers 
    (
     [Name] varchar(250), 
     [IdWorker] varchar(250),  
     [IdDepartment] int, 
     [IdDay] int, 
     [Day] varchar(250) 
    ); 


INSERT INTO SheduleWorkers ([Name], [IdWorker], [IdDepartment], [IdDay], [Day]) 
values 
('Sam', '001', 5, 1, 'Monday'), 
('Lucas', '002', 5, 2, 'Tuesday'), 
('Maria', '003', 5, 1, 'Monday'), 
('José', '004', 5, 3, 'Wednesday'), 
('Julianne', '005', 5, 3, 'Wednesday'), 
('Elisa', '006', 18, 1, 'Monday'), 
('Gabriel', '007', 23, 5, 'Friday'); 

私はこのように、各曜日のために、この日に作品部門5の労働者の名前を表示する必要があります。

MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY 
------ ------- --------- -------- ------ ------- 
Sam  Lucas Jose  
Maria    Julianne 

私はこの結果を得ることができます、私は提案を受け入れる、ありがとう。

答えて

2

あなたはこのためにピボットを使用することができます。あなたの問題については、以下のクエリを使用してください。パーティションを使用します。

SELECT [Monday] , [Tuesday] , [Wednesday] , [Thursday] , [Friday], [SATURDAY] 
FROM 
(SELECT [Day],[Name],RANK() OVER (PARTITION BY [Day] ORDER BY [Day],[Name]) as rnk 
FROM SheduleWorkers) p 
PIVOT(
Min([Name]) 
FOR [Day] IN 
([Monday] , [Tuesday] , [Wednesday] , [Thursday] , [Friday], [SATURDAY] ) 
) AS pvt 
+0

あなたの答え、;-D –

+0

あなたの歓迎のためにありがとうございました:) Esraa_92 @ Esraa_92 –

+0

@、私は気にしますができませんなぜ私は10分後に投稿された答えを受け入れたのですか?ちょうど私が何かが間違っていたかどうかを知りたい場合は –

5
DECLARE @SheduleWorkers TABLE 
    (
     [Name] VARCHAR(250) , 
     [IdWorker] VARCHAR(250) , 
     [IdDepartment] INT , 
     [IdDay] INT , 
     [Day] VARCHAR(250) 
    ); 


INSERT INTO @SheduleWorkers 
     ([Name], [IdWorker], [IdDepartment], [IdDay], [Day]) 
VALUES ('Sam', '001', 5, 1, 'Monday'), 
     ('Lucas', '002', 5, 2, 'Tuesday'), 
     ('Maria', '003', 5, 1, 'Monday'), 
     ('José', '004', 5, 3, 'Wednesday'), 
     ('Julianne', '005', 5, 3, 'Wednesday'), 
     ('Elisa', '006', 18, 1, 'Monday'), 
     ('Gabriel', '007', 23, 5, 'Friday'); 

; 
WITH cte 
      AS (SELECT Name , 
         Day , 
         ROW_NUMBER() OVER (PARTITION BY Day ORDER BY [IdWorker]) AS rn 
       FROM  @SheduleWorkers 
      ) 
    SELECT [MONDAY] , 
      [TUESDAY] , 
      [WEDNESDAY] , 
      [THURSDAY] , 
      [FRIDAY] , 
      [SATURDAY] 
    FROM cte PIVOT(MAX(Name) FOR day IN ([MONDAY], [TUESDAY], [WEDNESDAY], 
               [THURSDAY], [FRIDAY], [SATURDAY])) p 

出力:

MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY 
Sam  Lucas José  NULL  Gabriel NULL 
Maria NULL Julianne NULL  NULL NULL 
Elisa NULL NULL  NULL  NULL NULL 

主なアイデアは、一日全体で最大の重複があるので、あなたのように多くの行を与える共通テーブル式でrow_numberウィンドウ関数、です。

+0

あなたの答えのおかげでは、あなたのコードは、私には正しく動作し;-D –

1

私はあなたが必要なすべての日付の名前を取得するには、動的SQLでPIVOTを使用することをお勧め:

DECLARE @column nvarchar(max), 
     @sql nvarchar(max) 

;WITH cte AS (
SELECT DATENAME(WEEKDAY,0) as [Day], 1 as [Level] 
UNION ALL 
SELECT DATENAME(WEEKDAY,[Level]), [Level] + 1 
FROM cte 
WHERE [Level] < 7 
) 

SELECT @column = STUFF((SELECT ','+QUOTENAME([Day]) FROM cte ORDER BY [Level]FOR XML PATH('')),1,1,'') 

SELECT @sql = 
'SELECT '[email protected]+' 
FROM (
    SELECT Name, [Day], RANK() OVER (PARTITION BY [Day] ORDER BY [Day],IdWorker) as rn 
    FROM #SheduleWorkers 
) as p 
PIVOT 
(
MAX(NAMe) FOR [Day] IN ('[email protected]+') 
) as pvt' 

EXEC(@sql) 

は出力:

Monday Tuesday Wednesday Thursday Friday Saturday Sunday 
Sam  Lucas Jose  NULL  Gabriel NULL  NULL 
Maria NULL Julianne NULL  NULL NULL  NULL 
Elisa NULL NULL  NULL  NULL NULL  NULL 
関連する問題