【问题标题】:Aggregate Count rows that have the same values in two columns in SQL聚合计数在 SQL 中的两列中具有相同值的行
【发布时间】:2016-05-06 23:41:38
【问题描述】:

我对 SQL 很陌生,并且正在努力处理稍微高级一点的查询。我有一个查询,它返回一个这样的排序表:

更新查询:

我错误地发布了错误的查询。这是正确的类似查询。

SELECT distinct T.AidId  ,A.FirstName  ,A.LastName  ,T.EventName,  
FROM AidsDB.dbo.AidsInfo A  
JOIN AidsDB.dbo.TextsInfo T 
ON A.AidId = T.AidId

我需要做的是找出表中有多少行具有AideIdEventName 的匹配值,并在新列中返回数字以显示给用户。查询结果绑定到WebDataGrid,我最终将处理大量数据。

除其他外,我发现以下资源很有帮助,但似乎无法使其发挥作用。这个问题解决了在单独的查询中计算行数:Count Rows with same values in two columns

SELECT  A,
        B,
        COUNT(*)
FROM the-table
GROUP BY A,B

下面显示如何添加列:Add Column in SQL Query

SELECT 'Site1' AS SiteName,
        t1.column1, 
        t1.column2
FROM the-table 

有没有办法将这些组合起来以返回包含我想要的数据的单个表?可能是这样的:

SELECT (Count(*) Where EventName = EventName and AidId AidId) as Responses,
        [TextTime], 
        [TextSender], 
        [TextContents], 
        [AidID], 
        [EventName] 
FROM [TextsInfo] ORDER BY [TextTime] DESC

这有意义吗?

感谢任何帮助。提前致谢。

更新 #1:

我的数据如下所示:

消息表:

AidID   TextContents    TextSender  TextTime                        EventName   
12345   Msg1             company1   2016-05-04 15:37:40.1522000     event1
12345   Reply to Msg1    John Doe   2016-05-04 15:38:29.0000000     event1
98765   Msg1             company1   2016-05-04 16:37:04.8458000     event1

员工信息表:

AidID   FirstName       LastName
12345   John            Doe
98765   Mike            Smith

我正在寻找回复:

AidID   FirstName       LastName    EventName   Count
98765   Mike Smith      Smith       event1      1
12345   John            Doe         event1      2

计数列将根据每个员工拥有的特定事件的消息数量添加。如果他们有不止一个,这意味着他们已经做出了回应。否则他们没有。

更新 #2

对于任何感兴趣的人,这是我基于@M02 的回答的工作查询:

select distinct T.AidId  ,A.FirstName  ,A.LastName  ,T.EventName,
count(T.EventName + T.AidID) over(partition by T.EventName, T.AidID) cnt
from AidsDB.dbo.AidsInfo A  join  AidsDB.dbo.TextsInfo T on A.AidId = T.AidId

【问题讨论】:

  • 请添加您拥有的数据样本以及您想要的输出。
  • 您的最终查询确实有意义。

标签: sql sql-server join


【解决方案1】:

您可以通过查询加入组中的结果并获得如下结果:

SELECT t.A,t.B,C,D,E,F,t1.cnt FROM the_table t
JOIN (SELECT A,B,COUNT(*) cnt FROM the_table GROUP BY A,B) t1
ON t.A = t1.A
AND t.B = t1.B

这是使用聚合函数的另一种方法:

SELECT A,B,C,D,E,F, 
  count(a + b) over(partition by a,b) cnt
FROM the_table t

您可以在此处查看这两种方法的演示: http://rextester.com/KVDY97918

【讨论】:

  • 谢谢!!这非常有效。我目前正在使用方法二。我的查询有一个连接方法(请参阅更新的帖子),在我的情况下使用嵌套查询和聚合方法之间是否存在性能差异?谢谢。
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 2018-02-09
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
相关资源
最近更新 更多