根据标准sql汇总列总数

时间:2017-12-02 04:22:06

标签: sql sql-server aggregate-functions

我甚至不确定我是否正确地提出了这个问题。从算法上讲,我知道自己想做什么,但不知道SQL中的相应语法。

我创建了一个表,其中包含按客户编号,IP,会话开始时间和总会话长度计算的总在线会话时间。下面是这个表的示例(ip和CustNo被屏蔽,也不确定如何使表格如此原谅古怪):

CustNo  minDate                  maxDate                  ClientIp  timeDiff
123456  2017-11-14-02:39:27.093  2017-11-14-02:39:59.213  1.1.1.1   0.000372

然后,我创建另一个表,查找特定类型的活动,并想知道此特定用户在此特定活动之前使用该IP的时间。第二个表将每个活动包含为单独的行,customerID,IP和时间戳。

到目前为止没有问题,表格看起来很好。

我现在需要根据客户ID和IP编写将查看第一个表的部分,然后在会话最小开始时间小于活动时间的情况下总结该客户的所有IP使用情况,但我有不知道怎么做。这是当前的功能(显然不起作用)。我正在进行左连接,因为它可能是一个新的IP,它可能不在第一个表中。

SELECT 
    *, 
    SUM(##finalSessionSums.timeDiff) 
FROM 
    ##allTransfersToDiffReceip
LEFT JOIN 
    ##finalSessionSums ON ##allTransfersToDiffReceip.CustNo = ##finalSessionSums.CustNo 
                       AND ##allTransfersToDiffReceip.ClientIp = ##finalSessionSums.ClientIp 
                       AND ##allTransfersToDiffReceip.[DateTime] < ##finalSessionSums.minDate 

我在这里得到了一个聚合函数错误,但我根本不知道如何处理它。

2 个答案:

答案 0 :(得分:1)

您有SELECT *(返回所有列)和聚合函数(在本例中为SUM)。每当您将特定列与聚合,汇总值组合在一起时,您需要规定SELECT子句中GROUP BY子句中指定的每个列。例如

SELECT 
    A, B, SUM(C) as CSum
FROM
    Table
GROUP BY
    A, B

答案 1 :(得分:0)

由于信息很少,我无法提供完美的解决方案,但我会试一试:

首先,就像Alan提到的那样,你必须只选择聚合函数所需的列,即CustommerNo和Ip。要获得查询的总和,您必须将其分组如下:

{{1}}