如何在SQL中透视此表

如何在SQL中透视此表,sql,pivot,Sql,Pivot,我在尝试使用Microsoft NAV的active users表时遇到了这个问题。我被要求做的是Power BI中的仪表板或其他工具,它可以让我工作的公司了解在任何时间点有多少用户活跃在导航系统上。我在Power BI中发现了一个DAX公式,可以实现这一点,但它需要以下表格转换: 我正在SQL Management Studio中尝试这样做: 我的SQL Server是Microsoft SQL Azure RTM-12 知道会话ID可能会进一步重复,我如何使用以下结构旋转下面的NAV表 Se

我在尝试使用Microsoft NAV的active users表时遇到了这个问题。我被要求做的是Power BI中的仪表板或其他工具,它可以让我工作的公司了解在任何时间点有多少用户活跃在导航系统上。我在Power BI中发现了一个DAX公式,可以实现这一点,但它需要以下表格转换:

我正在SQL Management Studio中尝试这样做:

我的SQL Server是Microsoft SQL Azure RTM-12

知道会话ID可能会进一步重复,我如何使用以下结构旋转下面的NAV表

Session ID  |    Event Datetime       | Event Type
350              2017-07-01 01:00       Logon
350              2017-08-01 02:00       Logoff
351              2017-07-01 02:00       Logon
351              2017-08-01 03:00       Logoff
350              2017-09-01 01:00       Logon
350              2017-09-01 02:00       Logoff
最终结果将是每个会话ID的登录和注销时间,如果会话ID像本例中那样重复,则允许重复

先谢谢你

最好的


Andre

我不知道SQL的味道,只能给你一些基本的建议

通过执行内部联接,使两侧都排列到同一个表中,并在两侧的会话\u id上适当匹配别名,然后可以过滤其中一个别名表上的事件类型,使之等于另一个别名表上的登录和事件类型,以匹配注销


此方法应该适用于我使用过的几乎任何形式的SQL,因为它是SQL的核心功能。

这是TSQL代码,将在Azure数据库上运行。我想这会让你得到你想要的结果

DECLARE @ActiveUsersLog AS TABLE
      (
          sessionId     INT
         ,EventDateTime DATETIME
         ,EventType     VARCHAR(50)
      );

INSERT INTO @ActiveUsersLog
     (
         sessionId
        ,EventDateTime
        ,EventType
     )
VALUES
     (350, '2017-07-01 01:00', 'Logon')
    ,(350, '2017-08-01 02:00', 'Logoff')
    ,(351, '2017-07-01 02:00', 'Logon')
    ,(351, '2017-08-01 03:00', 'Logoff')
    ,(350, '2017-09-01 01:00', 'Logon')
    ,(350, '2017-09-01 02:00', 'Logoff');

WITH cte_logon
    AS (
           SELECT aul.sessionId
                 ,aul.EventDateTime
                 ,seq = RANK() OVER (PARTITION BY aul.sessionId ORDER BY aul.EventDateTime)
             FROM @ActiveUsersLog AS aul
            WHERE aul.EventType = 'Logon'
       )
    ,cte_logoff
    AS (
           SELECT aul.sessionId
                 ,aul.EventDateTime
                 ,seq = RANK() OVER (PARTITION BY aul.sessionId ORDER BY aul.EventDateTime)
             FROM @ActiveUsersLog AS aul
            WHERE aul.EventType = 'Logoff'
       )
SELECT o.sessionId
      ,LogonTime = o.EventDateTime
      ,LogoffTime = f.EventDateTime
  FROM cte_logon AS o
      LEFT OUTER JOIN cte_logoff AS f
          ON o.sessionId = f.sessionId
             AND o.seq = f.seq;
如果您只查找活动用户,则应添加此where子句:在添加where子句之前,请确保删除上述代码末尾的分号

where f.EventDateTime is null

你用的是什么产品?博士后?神谕SQL只是一种查询语言,而不是特定数据库产品的名称。到目前为止,您尝试了什么?????学习如何提问。我使用的是SQL Management Studio v17.3。有没有办法解决这个问题?SQL Management Studio不是一个数据库,而是一个数据库客户端。它适用于多个Microsoft SQL Server版本,您使用的是哪种版本?查询字符串@版本将告诉您。这是Microsoft SQL Azure RTM-12.0.2000.8非常感谢John!谢谢你,这正是我想要的!现在,我需要考虑如何计算任何给定时间的用户数=您就快到了,将最后一条select语句替换为:“select activeUsers=count*FROM cte_logon AS o LEFT OUTER JOIN cte_logoff AS f ON o.sessionId=f.sessionId和o.seq=f.seq,其中f.EventDateTime为NULL;”选择activeUsers=COUNT*FROM cte_logon AS o LEFT OUTER JOIN cte_logoff AS f ON o.sessionId=f.sessionId和o.seq=f.seq,其中f.EventDateTime为NULL;嗨,约翰!你真是天才!谢谢你,真的很有帮助!如果我们有一个表,其中的日期列从2017年1月1日一直到2017年12月1日,而另一个表中的日期列则是当天活跃的用户数,那会怎么样?那会很复杂吗?非常感谢,一点也不复杂。事实上,您可以使用一个理货表来为您生成日期,而不是在数据库中构建一个日期表,这是一件很棒的事情,但我离题了。查看这篇文章[获取一些灵感。非常感谢您的帮助!现在我需要进入统计任何给定时间的用户数量的表格=