首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询每日出勤出勤情况

SQL查询每日出勤出勤情况
EN

Stack Overflow用户
提问于 2020-11-03 13:55:54
回答 1查看 144关注 0票数 0

我是SQL Server的新手;我在编写这个查询时遇到了麻烦。

以下是我的示例数据:

代码语言:javascript
复制
   | Id |   date    |    time    |
   +----+-----------+------------+
   | 1  | 2020-11-1 | 07:30:00   |
   | 1  | 2020-11-1 | 15:50:00   |
   | 2  | 2020-11-1 | 07:30:00   |
   | 2  | 2020-11-1 | 15:54:00   |
   | 1  | 2020-11-2 | 07:31:00   |
   | 1  | 2020-11-2 | 15:46:00   |

这是我需要的结果:

代码语言:javascript
复制
| id |in_2020_11_01 | out_2020_11_01  |  in_2020_11_02 | out_2020_11_02 |
+----+--------------+-----------------+----------------+----------------+
| 1  |  07:30:00    |   15:50:00      |   07:31:00     |    15:46:00    |
| 2  |  07:30:00    |   15:54:00      |   00:00:00     |    00:00:00    |

我如何构建结果?有可能得到这样的结果吗?

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2020-11-03 14:39:21

您需要使用SQL dynamic并构建一条PIVOT语句。下面是完整的工作示例:

代码语言:javascript
复制
DROP TABLE IF EXISTS #DataSource;

CREATE TABLE #DataSource
(
    [Id] INT
   ,[date] DATE
   ,[time] TIME
);

INSERT INTO #DataSource ([Id], [date], [time])
VALUES (1, '2020-11-1', '07:30:00')
      ,(1, '2020-11-1', '15:50:00')
      ,(2, '2020-11-1', '07:30:00')
      ,(2, '2020-11-1', '15:54:00')
      ,(1, '2020-11-2', '07:31:00')
      ,(1, '2020-11-2', '15:46:00');

DECLARE @ColumnsPIVOT VARCHAR(MAX)
       ,@ColumnsSELECT VARCHAR(MAX)
       ,@DyanmicTSQLSTatement NVARCHAR(MAX);

WITH DataSource ([date], [prefix], [column_name]) AS
(
    SELECT DISTINCT [date]
                   ,[prefix]
                   ,[prefix] + '_' + REPLACE([date], '-', '_')
    FROM #DataSource
    CROSS APPLY
    (
        VALUES ('in')
              ,('out')
    ) DS ([prefix])
)
SELECT @ColumnsPIVOT = STUFF
                        (
                            (
                                SELECT ',' + QUOTENAME([column_name])
                                FROM DataSource
                                ORDER BY [date]
                                        ,[prefix]
                                FOR XML PATH(''), TYPE
                            ).value('.', 'VARCHAR(MAX)')
                            ,1
                            ,1
                            ,''
                        )
      ,@ColumnsSELECT = STUFF
                        (
                            (
                                SELECT ', ISNULL(' + QUOTENAME([column_name]) + ', ''00:00:00'') AS ' + QUOTENAME([column_name])
                                FROM DataSource
                                ORDER BY [date]
                                        ,[prefix]
                                FOR XML PATH(''), TYPE
                            ).value('.', 'VARCHAR(MAX)')
                            ,1
                            ,1
                            ,''
                        );


    -- SQL Server 2017+
    /*
    WITH DataSource ([date], [prefix], [column_name]) AS
    (
        SELECT DISTINCT [date]
                       ,[prefix]
                       ,[prefix] + '_' + REPLACE([date], '-', '_')
        FROM #DataSource
        CROSS APPLY
        (
            VALUES ('in')
                  ,('out')
        ) DS ([prefix])
    )
    SELECT @ColumnsPIVOT = STRING_AGG(QUOTENAME([column_name]), ',') WITHIN GROUP(ORDER BY [date], [prefix])
          ,@ColumnsSELECT = STRING_AGG('ISNULL(' + QUOTENAME([column_name]) + ', ''00:00:00'') AS ' + QUOTENAME([column_name]), ',') WITHIN GROUP(ORDER BY [date], [prefix])
    FROM DataSource;
    */
    
SET @DyanmicTSQLSTatement= 'SELECT [ID], ' + @ColumnsSELECT + '
                            FROM
                            (
                                SELECT [id]
                                      ,CASE ROW_NUMBER() OVER (PARTITION BY [ID], [Date] ORDER BY [Time])
                                            WHEN 1 THEN ''in''
                                            WHEN 2 THEN ''out''
                                       END + ''_'' + REPLACE([date], ''-'', ''_'')
                                      ,[time]
                                FROM #DataSource
                            ) DS ([id], [date], [time])
                            PIVOT
                            (
                                MAX([time]) FOR [date] IN (' + @ColumnsPIVOT +')
                            ) PVT';

EXEC sp_executesql @DyanmicTSQLSTatement;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64657470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档