【问题标题】:SQL query to select matrix user-day countSQL查询选择矩阵用户日计数
【发布时间】:2021-11-18 19:33:04
【问题描述】:

我有下一个数据

User Day
User1 Monday
User2 Monday
User3 Monday
User2 Tuesday
User3 Tuesday

我正在寻找将产生下一个结果的查询

User Monday Tuesday
User1 1 0
User2 1 1
User3 1 1

【问题讨论】:

    标签: sql database


    【解决方案1】:

    您可以使用如下所示的枢轴;

    WITH q AS (
      SELECT  aUser = 'User1', aDay = 'mon', aCount = 1
      UNION ALL   SELECT 'User1','mon',1
      UNION ALL   SELECT 'User1','mon',1
      UNION ALL   SELECT 'User2','mon',1
      UNION ALL   SELECT 'User3','tue',1
      UNION ALL   SELECT 'User2','wed',1
      UNION ALL   SELECT 'User3','thu',1
      UNION ALL   SELECT 'User2','thu',1
      UNION ALL   SELECT 'User2','thu',1
      UNION ALL   SELECT 'User2','mon',1
    )
    SELECT  aUser
            , mon = ISNULL(mon,0)
            , tue = ISNULL(tue,0)
            , wed = ISNULL(wed,0)
            , thu = ISNULL(thu,0)
            , fri = ISNULL(fri,0)
            , sat = ISNULL(sat,0)
            , sun = ISNULL(sun,0)
    FROM    (
              SELECT  *
              FROM    q
            ) s
    PIVOT   (sum(aCount) FOR aDay IN (mon,tue,wed,thu,fri,sat,sun)) pvt
    

    【讨论】:

      【解决方案2】:

      您可以使用 PIVOT 来更改带有列的行:

      就这两天:

      SELECT *
      FROM (
          SELECT [day], [user]
          FROM table1
      ) as s
      PIVOT
      (
          count([day])
          FOR [day] IN (Monday, Tuesday)
      )AS pvt
      

      一周中的所有日子:

      SELECT *
      FROM (
          SELECT [day], [user]
          FROM table1
      ) as s
      PIVOT
      (
          count([day])
          FOR [day] IN (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
      )AS pvt
      

      【讨论】:

        【解决方案3】:

        我使用条件聚合方法比 PIVOT 方法更好,因为我觉得它的语法不那么复杂,限制也少(效率也不差)。

        select [User],
          SUM(case when Day = 'Monday' then 1 else 0 end) Monday,
          SUM(case when Day = 'Tuesday' then 1 else 0 end) Tuesday
        from YourTable
        group by [User]
        

        顺便说一句,你不应该使用User作为字段名,因为它是一个保留字。

        DBFiddle:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1f7d06eaa4ac8f23498a71ff552a6a4f

        【讨论】:

          猜你喜欢
          • 2016-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多