让我说我有客户详细记录表,其中包含列:
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
有可能吗?如果是这样,那么该如何做>谢谢你的帮助
答案 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是否支持某种语法。