【问题标题】:Calculate Count from a view ( SQL)从视图计算计数 (SQL)
【发布时间】:2016-06-30 13:57:46
【问题描述】:

我有这个观点:

SELECT [ID]
      ,[PersonName]
      ,[PersonFUNCTION]
      ,[GUESTName]
      ,[Team]
      ,[sector]
      ,[MeetingCity]
      ,[GUESTCOMPANY]
      ,[TypeMeeting]
  FROM [DB_TEST].[dbo].[Meetings]

从这个观点我们可以阅读示例:

名称为“XXX”的人 (PersonName) 是首席执行官 (PersonFUNCTION),他在巴黎 (MeetingCity) 与“Mark Zuckerberg” (GUESTName) 会面,“Facebook”是 (GUESTCOMPANY),最后是会议是“一对一会议”(TypeMeeting)!

PS:请注意,XXX 可以多次与马克·扎克伯格会面,例如在不同的城市。

我想做的是:

添加 3 列:计数(一对一会议)和计数(一对一会议)和计数(小组会议)

  • 计数(一对一会议)= [PersonName] 在一对一会议中与 [GUESTName] 会面的次数,无论城市不同或其他任何不同...

类似的东西:

SELECT [ID]
      ,[PersonName]
      ,[PersonFUNCTION]

     ,Count( One to One Meeting between PersonName and GUESTName )  ?
     ,Count( One to Few Meeting between PersonName and GUESTName)  ?
     ,Count ( Group Meeting between PersonName and GUESTName) ?

      ,[GUESTName]
      ,[Team]
      ,[sector]
      ,[MeetingCity]
      ,[GUESTCOMPANY]
      ,[TypeMeeting]
  FROM [DB_TEST].[dbo].[Meetings]

谢谢

【问题讨论】:

  • 请不要写一段描述您的查看结果的段落 - 显示结果

标签: sql sql-server count subquery


【解决方案1】:

这样的东西应该可以帮助您获取所有列和计数。

SELECT  [ID],
        [PersonName],
        [PersonFUNCTION],
        m2.OneToOneCount, --Count( One to One Meeting between PersonName and GUESTName )
        m2.OneToFewCount, --Count( One to Few Meeting between PersonName and GUESTName)
        m2.GroupCount,    --Count ( Group Meeting between PersonName and GUESTName) 
        [GUESTName],
        [Team],
        [sector],
        [MeetingCity],
        [GUESTCOMPANY],
        [TypeMeeting]
FROM    [DB_TEST].[dbo].[Meetings] m
        CROSS APPLY (SELECT COUNT(CASE WHEN m2.[TypeMeeting] = 'OneToOne' THEN 1 END) AS OneToOneCount,
                            COUNT(CASE WHEN m2.[TypeMeeting] = 'OneToFew' THEN 1 END) AS OneToFewCount,
                            COUNT(CASE WHEN m2.[TypeMeeting] = 'Group' THEN 1 END) AS GroupCount
                     FROM   [DB_TEST].[dbo].[Meetings] m2
                     WHERE  m2.[PersonName] = m.[PersonName]
                            AND m2.[GUESTName] = m.[GUESTName]) m2

如果您不能使用 CROSS APPLY,这是一个 JOIN 替代方案。

SELECT  [ID],
        [PersonName],
        [PersonFUNCTION],
        m2.OneToOneCount, --Count( One to One Meeting between PersonName and GUESTName )
        m2.OneToFewCount, --Count( One to Few Meeting between PersonName and GUESTName)
        m2.GroupCount,    --Count ( Group Meeting between PersonName and GUESTName) 
        [GUESTName],
        [Team],
        [sector],
        [MeetingCity],
        [GUESTCOMPANY],
        [TypeMeeting]
FROM    [DB_TEST].[dbo].[Meetings] m
        JOIN (  SELECT  [PersonName],
                        [GUESTName],
                        COUNT(CASE WHEN m2.[TypeMeeting] = 'OneToOne' THEN 1 END) AS OneToOneCount,
                        COUNT(CASE WHEN m2.[TypeMeeting] = 'OneToFew' THEN 1 END) AS OneToFewCount,
                        COUNT(CASE WHEN m2.[TypeMeeting] = 'Group' THEN 1 END) AS GroupCount
                FROM    [DB_TEST].[dbo].[Meetings] m2
                GROUP BY [PersonName],
                        [GUESTName]
         ) m2 ON m2.[PersonName] = m.[PersonName]
             AND m2.[GUESTName] = m.[GUESTName]

【讨论】:

    【解决方案2】:

    BM

    另一种解决方案可能是使用SQL Pivot query

    这里是示例数据和 SQL pivot Select 语句

    SELECT *
    FROM (
      SELECT
        [ID],
        [PersonName],
        [TypeMeeting]
      FROM [Meetings]
    ) TableData
    PIVOT (
      Count(ID)
      FOR [TypeMeeting] IN (
        [T1],[T2],[T3],[T4],[T5],[T6]
      )
    ) PivotTable
    

    我只是用'T1'等作为会议类型,您需要将它们替换为“[]”中的实际值

    这是结果

    如果你有很多不同的会议类型,你可以使用dynamic pivot query in SQL Server,但我想上面的解决方案就足够了

    【讨论】:

    • 感谢您的回答!该解决方案为我提供了每种会议的计数!不幸的是,我不知道如何在此查询中引入 GUEST 名称以解决问题 - 获取 Person 和 Guest 之间每种类型的会议的计数!老实说,这是我第一次使用数据透视表!
    • @S.BM 为了迂腐,数据透视表是 Excel 事物的名称,它与 SQL Server 中的 pivot 关键字没有直接关系(即仅在概念上)。
    • @S.BM,您可以在 SELECT 列表中添加额外的列列表,例如:SELECT * FROM (SELECT [ID], [PersonName], GUESTName, [TypeMeeting] FROM [Meetings]) TableData PIVOT ( Count(ID) FOR [TypeMeeting] IN ( [T1],[T2],[T3],[T4],[T5],[T6] ) ) 数据透视表
    【解决方案3】:

    您可以使用条件聚合:

    select PersonName, GuestName,
           sum(case when TypeMetting = 'one-to-one' then 1 else 0 end) as Num_OneToOne,
           sum(case when TypeMetting = 'one-to-few' then 1 else 0 end) as Num_OneToFew,
           sum(case when TypeMetting = 'group' then 1 else 0 end) as Num_Group
    from Meetings
    group by PersonName, GuestName;
    

    【讨论】:

    • 这个解决方案的问题是我不再能够显示其他列,因为它们不包含在 Group by 子句中!如果我将它们添加到 Group by 子句中,结果将始终相同且等于 1,因为每一行都是唯一的!
    【解决方案4】:

    你可以使用SQL COUNT function with Partition By子句

    试试

    SELECT Distinct [ID]
          ,[PersonName]
          ,[TypeMeeting] --...
          ,COUNT([TypeMeeting]) OVER (PARTITION BY [PersonName], [TypeMeeting]) Cnt
    FROM [Meetings]
    

    结果如下

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多