sql - 如何在 SQL Server 列中显示行值?

标签 sql sql-server group-by union-all weekday

SQL FIDDLE DEMO HERE

我有 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 的 worker 姓名,如下所示:

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

主要思想是公共(public)表表达式中的row_number窗口函数,它将为您提供与一天内最大重复项相同的行数。

关于sql - 如何在 SQL Server 列中显示行值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294168/

相关文章:

sql - 如何在 SQL Server 中备份对称 key ?

java - LINQ for Java 工具

sql - 如何在postgresql中对json类型使用唯一约束

sql - 在 postgres 中使用不同的日期和聚合函数

group-by - 如何在 hive 中的每个组中按计数 desc 排序?

带有 PostgreSQL 的 Java JDBC : PreparedStatement Execute with Add Column Query returns false

sql-server - 获取详细的 SSRS 错误

sql - 将一些列转置为行

sql - 查找丢失和无序的记录

python - 比较 GroupBy 中的值并计算匹配的行数