sql总结了呼叫详细记录表中的连接时间

时间:2014-05-07 22:20:52

标签: sql sql-server-2008-r2

让我说我有客户详细记录表,其中包含列:

UserAId
UserBId
Duration
Impulses

例如:

UserAId UserBId Duration Impulses
1       2       30       5
1       2       20       3
2       1       10       2
2       3       5        1

好的,现在我想写一个查询,它会聚合总持续时间,脉冲和没有方向的用户之间的通话次数,以便结果如下:

UserAId UserBId TotalDuration TotalImpulses TotalCallsCount
1       2       60            10            3
2       3       5             1             1

有可能吗?如果是这样,那么该如何做>谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

当然,如果你执行这样的查询:

SELECT
  UserAId,
  UserBId,
  SUM(Duration) AS TotalDuration,
  SUM(Impulses) AS TotalImpulses,
  COUNT(*)      AS TotalCallsCount
FROM CustomerDetail
GROUP BY UserAId, UserBId

......你不会得到你想要的东西。这是因为此查询不会聚合并组合具有UserAId = 1和UserBId = 2的行与具有UserAId = 2和UserBId = 1的行。

要做你想做的事,你需要一个小技巧。您在结果集中调用UserAId和UserBId实际上并不总是您在输入表上读取的内容。此查询将按您的要求执行:

SELECT
  CASE WHEN UserAId<UserBId THEN UserAId ELSE UserBId END AS User_AId,
  CASE WHEN UserAId<UserBId THEN UserBId ELSE UserAId END AS User_BId,
  SUM(Duration) AS TotalDuration,
  SUM(Impulses) AS TotalImpulses,
  COUNT(*)      AS TotalCallsCount
FROM CustomerDetail
GROUP BY
  CASE WHEN UserAId<UserBId THEN UserAId ELSE UserBId END,
  CASE WHEN UserAId<UserBId THEN UserBId ELSE UserAId END

...即使UserAId = UserBId(你没有说明这两个值是否可以相同),它仍然有效。你总是得到User_AId作为2个Ids中的较小者,而User_BId得到2个Ids中的较大者...即使该组合不存在为UserAId,UserBId也不在表中(显然只有当它作为UserBId存在时, UserAId)。

我在SQLFiddle here上测试了这个。

我不是SQL-Server专家。某些引擎允许GROUP BY子句引用SELECT表达式列表中定义的计算列,而无需显式重新定义它们。这是非标准SQL,但它确实使SQL更具可读性。不确定SQL-Server是否支持某种语法。