2016-05-18 9 views
4

SQL FIDDLE DEMO HEREWie kann ich Zeilenwerte in Spalten SQL-Server anzeigen?

Ich habe diese Tabellenstruktur für SheduleWorkers Tabelle:

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'); 

Ich muss für jede Woche Tag die Namen der Arbeiter in der Abteilung 5, die an diesem Tag arbeitet, wie dies anzuzeigen:

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

Wie kann ich dieses Ergebnis erhalten, akzeptiere ich Vorschläge, danke.

Antwort

2

Sie schwenken dafür verwenden können. Bitte verwenden Sie die untenstehende Abfrage für Ihr Problem. Und benutze Partition.

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

Ihnen sehr für Ihre Antwort danken, ;-D –

+0

Ihre Welcome :) @ Esraa_92 –

+0

@ Esraa_92, ich habe nichts dagegen, sondern kann Du erklärst, warum hast du die Antwort angenommen, die 10 Minuten später als meine gepostet wurde? Ich will nur wissen, ob ich etwas falsch gemacht habe :) –

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 

Ausgang:

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

Die Hauptidee ist row_number Fensterfunktion in der allgemeinen Tabellenausdruck, mit dem Sie so viele Zeilen geben, da es maximal Duplikaten in einem Tag.

+0

Vielen Dank für Ihre Antwort, Ihr Code mir richtig funktioniert ;-D –

1

Ich schlage vor, Sie PIVOT mit dynamischem SQL zu verwenden, um alle Datum Namen, die Sie brauchen:

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) 

Ausgang:

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 
Verwandte Themen