在列上分组并获取该列的总和

时间:2013-05-08 09:18:52

标签: sql sql-server group-by

我有一张桌子:

------------------------------------
ReportDate  | DAGName | MailboxCount
------------------------------------

此表中有很多记录。我必须在特定年份的每个月的第一天获得每个dagName的mailboxcount的总和。

------------------------------------
ReportDate  | DAGName | MailboxCount
------------------------------------
01-01-2012  | abc     |  25
01-02-2012  | xyz     |  55
01-02-2012  | abc     |  125
01-03-2012  | lmn     |  225
01-01-2012  | ghf     |  325
01-03-2012  | kil     |  525
11-03-2012  | kil     |  525
21-03-2012  | kil     |  625
10-05-2012  | jil     |  225
20-11-2012  | kil     |  1525
04-03-2012  | Mil     |  5025

所以我想要的结果是

---------------------------------
Month Name     | Count
---------------------------------
 January       | 350
 Ferbuary      | 150
 March         | 850 

我的查询

SELECT SUM(MailboxCount) AS Count,DagName
              ,MONTH(CAST(ReportDate AS DATETIME))
              ,DATENAME(month, ReportDate)  AS 'Month Name'
        FROM MailboxDatabase
        WHERE (CONVERT(VARCHAR, CONVERT(VARCHAR(10), [ReportDate], 103), 103)
        IN ( '01/01/'+ @year,'01/02/'+ @year,
             '01/03/'+ @year,'01/04/'+ @year,
             '01/05/'+ @year,'01/06/'+ @year,
             '01/07/'+ @year,'01/08/'+ @year,
             '01/09/'+ @year,'01/10/'+ @year,
             '01/11/'+ @year,'01/12/'+ @year 
            ))
        GROUP BY  MONTH(CAST(ReportDate AS DATETIME)),DATENAME(month, ReportDate),DagName  
        ORDER BY 2

我很好,如果有一些额外的列,如我的查询。但它没有给我正确的结果。任何帮助?

4 个答案:

答案 0 :(得分:3)

我可能完全误解了这个问题但是不满足以下内容吗?

  SELECT  [Month Name] = DATENAME(month, ReportDate), [Count] = SUM(MailboxCount)
  FROM    MailboxDatabase
  WHERE   DAY(ReportDate) = 1
          AND YEAR(ReportDate) = 2012
  GROUP BY
          DATENAME(month, ReportDate)

测试脚本

;WITH MailboxDatabase AS (
  SELECT * FROM (VALUES
      ('01-01-2012', 25)
    , ('02-01-2012', 55)
    , ('02-01-2012', 125)
    , ('03-01-2012', 225)
    , ('01-01-2012', 325)
    , ('03-01-2012', 525)) AS X(ReportDate, MailboxCount)
)
  SELECT  [Month Name] = DATENAME(month, ReportDate)
          , [Count] = SUM(MailboxCount)
          , Month = MONTH(ReportDate)
  FROM    MailboxDatabase
  WHERE   DAY(ReportDate) = 1
          AND YEAR(ReportDate) = 2012
  GROUP BY
          DATENAME(month, ReportDate), MONTH(ReportDate)
  ORDER BY
          MONTH(ReportDate)

答案 1 :(得分:1)

SELECT DATENAME(MONTH, CONVERT(DATETIME, ReportDate, 105)) Month, 
       SUM(MailboxCount) COUNT
FROM   tableName
GROUP  BY DATENAME(MONTH, CONVERT(DATETIME, ReportDate, 105))

更新1

SELECT DATENAME(MONTH, CONVERT(DATETIME, ReportDate, 105)) Month, 
       SUM(MailboxCount) COUNT
FROM   tableName
WHERE  (CONVERT(VARCHAR(15), CONVERT(DATETIME, ReportDate, 105), 103)
        IN ( '01/01/'+ '2012','01/02/'+ '2012',
             '01/03/'+ '2012','01/04/'+ '2012',
             '01/05/'+ '2012','01/06/'+ '2012',
             '01/07/'+ '2012','01/08/'+ '2012',
             '01/09/'+ '2012','01/10/'+ '2012',
             '01/11/'+ '2012','01/12/'+ '2012' 
            ))
GROUP  BY MONTH(CONVERT(DATETIME, ReportDate, 105)),
          DATENAME(MONTH, CONVERT(DATETIME, ReportDate, 105))
ORDER  BY MONTH(CONVERT(DATETIME, ReportDate, 105))

答案 2 :(得分:1)

试试这个 -

<强>查询:

SET DATEFORMAT dmy

DECLARE @temp TABLE
(
      ReportDate DATETIME
    , DAGName NVARCHAR(50)
    , MailboxCount INT
)

INSERT INTO @temp (ReportDate, DAGName, MailboxCount)
VALUES 
    ('01-01-2012',  'abc', 25),
    ('01-02-2012',  'xyz', 55),
    ('01-02-2012',  'abc', 125),
    ('01-03-2012',  'lmn', 225),
    ('01-01-2012',  'ghf', 325),
    ('01-03-2012',  'kil', 525),
    ('11-03-2012',  'kil', 525),
    ('21-03-2012',  'kil', 625),
    ('10-05-2012',  'jil', 225),
    ('20-11-2012',  'kil', 1525),
    ('04-03-2012',  'Mil', 5025)

DECLARE @year INT = 2012

SELECT 
      [Count] = SUM(MailboxCount)
    , Month_Name = DATENAME(MONTH, ReportDate)
FROM @temp
WHERE DAY(ReportDate) = 01 
    AND YEAR(ReportDate) = @year
GROUP BY ReportDate
ORDER BY ReportDate

<强>输出:

Count       Month_Name
----------- ------------------------------
350         January
180         February
750         March

答案 3 :(得分:0)

SELECT 
      DATENAME(MONTH, CONVERT(DATETIME, ReportDate, 105)) AS [MonthName],
      YEAR(CONVERT(DATETIME, ReportDate, 105)) AS [Year],
      SUM(MailboxCount) COUNT
FROM tableName
GROUP BY 
      DATENAME(MONTH, CONVERT(DATETIME, ReportDate, 105)),
      YEAR(CONVERT(DATETIME, ReportDate, 105))

尝试上面的sql查询,此查询以年度月份和计数返回结果。