从视图计算计数 (SQL)

Calculate Count from a view ( SQL)

我有这个观点:

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

从这个角度我们可以阅读例如:

姓名为 "XXX" (PersonName) 的 CEO (PersonFUNCTION) 正在巴黎 (MeetingCity) 与 "Mark Zuckerberg" (GUESTName) 开会,"Facebook" 是( GUESTCOMPANY ) 最后会议是 "One to One Meeting" (TypeMeeting) !

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

我想做的是:

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

类似这样的事情:

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]

谢谢

您可以使用条件聚合:

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;

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

尝试

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

结果如下

BM

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

这是示例数据和 SQL 数据透视表 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,但我想上述解决方案就足够了

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

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]