SQL sum函数 - 如何求和并仍然包含非求和列

时间:2016-09-30 20:41:14

标签: sql-server

我想通过startDate对列进行求和。共有3,213行。

我希望并期望只获得51行。

如果我使用它,我得到3,213但不是每个StartDate总结的。因此51行。

SELECT SwitchID as S,
       PortIndex as P,
       SUM(BandwidthIn) as sum1,
       SUM(BandwidthOut) as sum2,
       SUM(BandwidthInMbps) as sum3,
       SUM(BandwidthOutMbps) as sum4,
       StartDate,
       EndDate,
       'day' as D
FROM dbo.BandwidthLogCalculatedTest
WHERE ( StartDate < CAST(DATEADD(DAY, -1, GETDATE()) AS DATETIME) )
AND (EntryType = 'Second' )
GROUP BY StartDate,
         EndDate,
         SwitchID,
         PortIndex

例如(显示3,213行中的3行):

S P sum1 sum2 sum3 sum4 StartDate               EndDate                 D
8 1 2184 821  0.00 0.00 2016-08-29 17:00:30.810 2016-08-29 17:01:00.827 day
8 2 0    2    0.00 0.00 2016-08-29 17:00:30.810 2016-08-29 17:01:00.827 day
8 3 621 598   0.00 0.00 2016-08-29 17:00:30.810 2016-08-29 17:01:00.827 day

如果使用这个,我得到正确的行数,但没有Switchid, PortIndex,StartDate,Enddate和&#39; day&#39;我也需要的名称。

SELECT  SUM(BandwidthIn) as BandwidthIn,
        SUM(BandwidthOut) as BandwidthOut,
        SUM(BandwidthInMbps) as BandwidthInMbps,
        SUM(BandwidthOutMbps) as BandwidthOutMbps,
        'day' as EngtryType
FROM dbo.BandwidthLogCalculatedTest
WHERE ( StartDate < CAST(DATEADD(DAY, -1, GETDATE()) AS DATETIME) )
AND ( EntryType = 'Second' )
GROUP BY StartDate,
         EndDate

例如(显示51行中的2行):

BandwidthIn BandwidthOut  BandwidthInMbps BandwidthOutMbps EntryType
429688      625227        98.00           150.00           day
497928      688985        113.00          167.00           day

1 个答案:

答案 0 :(得分:1)

听起来你期望的输出与你想要的目的不符。这个目的似乎是按天计算带宽,在这种情况下,Switch_idPortIndex的分组会以您不想要的方式分割您的数据,除非每个StartDate / {{1 }}组合只有EndDateSwitch_id的每个值。

如果每个PortIndex / StartDate组合只有一个值EndDateSwitch_id,则您的第一个查询将返回您期望的51行,并且您可以选择{ {1}}和PortIndex。但是,如果每个Switch_id / PortIndex组合具有多个StartDateEndDate值,您将获得更多行,因为它正在寻找所有四个字段的唯一组合。

如果我正确理解您的意图,您只需将Switch_idPortIndex的第一个查询更改为分组。由于您要对StartDateEndDate值进行求和,因此无法选择这些变量。

代码将是:

Switch_id