【问题标题】:Store Results of Query to A variable in SQL Server将查询结果存储到 SQL Server 中的变量
【发布时间】:2018-10-22 04:50:57
【问题描述】:

我有以下数据:

CREATE TABLE TimeLog 
(
     [User] NVARCHAR(6),
     [Event] NVARCHAR(3),
     [Time] DATETIME
);

INSERT INTO TimeLog 
VALUES (N'Mark', N'IN', '2015-04-15 00:31:00'),
       (N'Mark', N'IN', '2015-04-16 20:10:00'),
       (N'Mark', N'IN', '2015-04-21 14:59:00'),
       (N'Mark', N'OUT', '2015-04-22 01:01:00'),
       (N'Mark', N'IN', '2015-04-22 10:46:00'),
       (N'Mark', N'OUT', '2015-04-23 00:58:00'),
       (N'Mark', N'IN', '2015-04-23 14:50:00'),
       (N'Mark', N'OUT', '2015-04-24 01:37:00'),
       (N'Mark', N'OUT', '2015-04-25 01:01:00'),
       (N'Mark', N'OUT', '2015-04-27 00:57:00'),
       (N'Mark', N'IN', '2015-04-17 10:32:00'),

我已使用查询将 IN 和 OUT 分隔到不同的列:

SELECT 
    [UserName], [IN], [OUT] 
FROM
    (SELECT 
         ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) + ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) % 2 AS [PairID],
         *
     FROM  
         [dbo].[AttendanceEvents] 
     WHERE
         UserName = 'Mark') DS
PIVOT
    (MAX([EventTime]) 
        FOR [EventName] IN ([IN], [OUT])
    ) PVT
ORDER BY 
    [PairID];

现在我想将此查询的结果存储到一个变量或一个表中,以便从每个 Datetime 列、IN 和 OUT 两列中找出平均时间。

我该怎么做?

【问题讨论】:

  • 请提供您的预期输出
  • 请注意,将输入和输出分隔到不同列的查询会跳过值 - 例如,15.04.2015 00:31:00IN 事件、17.04.2015 10:32:00IN 事件、OUT 事件24.04.2015 01:37:00 的所有位置都在数据透视查询的结果中丢失。

标签: sql-server database ssms


【解决方案1】:

您可以只定义一个 CTE,然后查询:

WITH cte AS (
    SELECT [UserName], [IN], [OUT] 
    FROM
    (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) +
          ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) % 2 AS [PairID]
        FROM [dbo].[AttendanceEvents]
        WHERE UserName = 'Mark'
        ) DS
        PIVOT
        (
            MAX([EventTime]) FOR [EventName] IN ([IN], [OUT])
        ) PVT
    ) t
)

SELECT AVG([IN]) AS avg_in, AVG([OUT]) AS avg_out
FROM cte;

【讨论】:

    【解决方案2】:

    最简单的解决方案是即时执行:

    SELECT [UserName]
      ,AVG(DATEDIFF(minute,[OUT],[IN])) AvgMinutes 
    
    FROM
    (
    SELECT ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) + ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) % 2 AS [PairID]
          ,*
    FROM [dbo].[AttendanceEvents] Where UserName = 'Mark'
    ) DS
    PIVOT
    (
    MAX([EventTime]) FOR [EventName] IN ([IN], [OUT])
    ) PVT
    GROUP BY [UserName];
    

    但是如果你想把它插入到某个东西中,请使用insert

    可以是本地临时表、全局临时表或表变量。

    或者您可以使用前面提到的 CTE 方法。

    这是一个示例。您必须使用适当的数据类型。我刚用VARCHAR

    我删除了order by,因为数据永远不会以任何顺序插入 - 只有当您选择它时。

    DECLARE @MyTableVariable TABLE (
        Username VARCHAR(50),
        In DATETIME,
        Out DATETIME
    )
    
    INSERT INTO @MyTableVariable (UserName, In, Out)
    SELECT [UserName]
      ,[IN]
      ,[OUT] 
    FROM
    (
    SELECT ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) + ROW_NUMBER() OVER (PARTITION BY [UserName] ORDER BY [EventTime]) % 2 AS [PairID]
          ,*
    FROM [dbo].[AttendanceEvents] Where UserName = 'Mark'
    ) DS
    PIVOT
    (
    MAX([EventTime]) FOR [EventName] IN ([IN], [OUT])
    ) PVT;
    

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2014-04-24
      • 2015-01-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多