从视图计算计数 (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 列:计数(一对一会议)和计数(一对多会议)和计数(小组会议)
- 计数(一对一会议)= [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]
谢谢
您可以使用条件聚合:
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]
我有这个观点:
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 列:计数(一对一会议)和计数(一对多会议)和计数(小组会议)
- 计数(一对一会议)= [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]
谢谢
您可以使用条件聚合:
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]