2013-05-08 4 views
2

У меня есть таблица:группы по на колонке и получить сумму этого столбца

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

Существует много записей в этой таблице. Я должен получить сумму почтового ящика каждого имени dagName в первый день каждого месяца в течение определенного года.

------------------------------------ 
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 

Я хорошо, если некоторые дополнительные колонки, как идет с моим запросом. Но это не дает мне правильный результат. Любая помощь ??

+0

Удалить DagName, это не часть вашей группировки, reportDate - это какой тип не является датой. –

+0

НЕ ВСЕГДА используйте 'VARCHAR', не указав длину, или она вернется и преследует вас. –

+0

Нет, это не так, как дата не первый день месяца .... – ankur

ответ

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) 
+0

почти все, но мне нужно в первый день с группой по группам tooo – ankur

+0

@ankur - Этого я не понимаю. Вы можете уточнить, добавив требование к вашему опубликованному примеру * (ps. Count в вашем примере выключен) * –

+0

обновил таблицу, вы можете понять, что я пытаюсь сказать ... – ankur

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

UPDATE 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)) 
+0

результат верный, но нет никакого условия для даты, так как будет много записей других дат тоже .. – ankur

+0

@ankur позвольте мне уточнить ответ. –

+0

FYI, имя таблицы MailboxDatabase –

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 
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, этот запрос возвращает результат с мудрым месяцем и счетчиком года.

Смежные вопросы