2013-11-27 7 views
0

Я смотрю на другой аспект панели управления продаж, над которой я работаю;QL - Группировка данных о продажах по месяцам - SQL Server 2008

соответствующих пунктов в запрашиваемом набора данных следующим образом:

Invoice Date, Margin Amount

Я хотел бы получить выход, такие как:

     2012   2013 
January    $0    $0 
February    $0    $0 
March    $0    $0 
April    $0    $0 
May     $0    $0 
June     $0    $40 
July     $0    $40 
August    $0    $0 
September   $0    $0 
October    $0    $40 
November    $0    $0 
December    $0    $0 

Образец данных: (Ненужные поля не включены)

Invoice Date  Margin Amount 
2013-06-27  40 
2013-07-29  40 
2013-10-30  40 

I a lso сделала таблицу с перечислением start date и end date каждого месяца. Поля следующие:

Month Year Start_Date End_Date 
January 2000 01/01/2000 31/01/2000 
February 2000 01/02/2000 28/02/2000 

Все вплоть до декабря 2016 года, если это помогает ...

Я надеялся, что все поля Margin могут быть добавлены вместе - Когда я говорю, подвел итог, я имею в виду все транзакции, которые произошли в январе будет добавлено вместе (так что в выходной таблице, после января и до 2010 года будет общая сумма маржи в январе 2010 года). Каждая транзакция имеет поле поля и дату.

Поблагодарили бы за любую помощь.

+0

Мы предполагаем догадаться, как вы получили свои ежемесячные цифры? –

+0

Сделал образец данных немного понятнее. Цифры просто хранятся в виде суммы маржи в таблице и не отображаются в кавычках. –

+0

Насколько она вам гибкой? Всего два года: текущий и предыдущий? –

ответ

0

Я думаю, что следующее делает то, что вам нужно. Я использовал годы с 2011 по 2015 год. Первый бит подделывает входные таблицы с помощью серии CTE. Вы замените их фактическими данными. Запрос агрегирует маржу по месяцам/годам, а затем использует запрос PIVOT для преобразования каждый год в горизонтальные столбцы.

Редактировать: Код был изменен для работы с SqlFiddle OP.

WITH 
months AS (SELECT 1 AS mon UNION ALL SELECT mon + 1 FROM months WHERE mon < 12), 
years AS (SELECT 2011 AS yr UNION ALL SELECT yr + 1 FROM years WHERE yr < 2015) 

-- End data setup, real work begins here 
SELECT * FROM 
(
SELECT 
    months.mon, years.yr, COALESCE(SUM(inv.[Margin Amount]), 0) AS MarginAmount 
FROM 
    months 
    CROSS JOIN years 
    LEFT OUTER JOIN All1 inv ON ((YEAR(inv.[Invoice Date]) = years.yr) AND (MONTH(inv.[Invoice Date]) = months.mon)) 
GROUP BY 
    months.mon, years.yr 
) AS source 
PIVOT 
(
    MAX(MarginAmount) 
    FOR yr in ([2011], [2012], [2013], [2014], [2015]) 
) 
AS pvt 
ORDER BY mon 
+0

Это дает мне отличный формат для отчета, но, к сожалению, он не собирает информацию, содержащуюся в таблице «Все» (т.е. [Все]. [Сумма счета]. Результат - именно то, что я имел в виду, но я был надеясь, что tog et invoice $ подключится к таблице –

+0

Сумма счета не была отображена в ваших образцовых данных, поэтому я не знал. Требуется ли сумма счета помимо поля, а не поля или суммирована с margin – dazedandconfused

+0

Извините, что я имел в виду сумму маржи в последнем сообщении, а не сумму счета. Позвольте мне попробовать еще раз: Данные образца, которые я поставил в первом посте, - это просто идея стиля данных в таблице под названием «Все». Годы находятся в отдельной таблице под названием «Даты». В таблице «Все» есть сотни сотен транзакций - я надеялся суммировать m вместе были сгруппированы по тому месяцу, в котором они произошли, - так что, как и демоверсия первого сообщения, но с фактической суммой маржи, рассчитываемой там –

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