如何在服务器 sql 列中显示行值?
How can I display rows values in columns sql server?
我有这个 table 结构用于 SheduleWorkers table:
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
如何得到这个结果,我接受建议,谢谢。
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
window 通用 table 表达式中的函数,它将为您提供与一天中最大重复项一样多的行。
我建议您使用 PIVOT 和动态 SQL 来获取您需要的所有日期名称:
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 '+@column+'
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 ('+@column+')
) 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
您可以为此使用数据透视表。请使用以下查询来解决您的问题。并使用分区。
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
我有这个 table 结构用于 SheduleWorkers table:
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
如何得到这个结果,我接受建议,谢谢。
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
window 通用 table 表达式中的函数,它将为您提供与一天中最大重复项一样多的行。
我建议您使用 PIVOT 和动态 SQL 来获取您需要的所有日期名称:
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 '+@column+'
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 ('+@column+')
) 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
您可以为此使用数据透视表。请使用以下查询来解决您的问题。并使用分区。
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