GTR0123 Ответов: 1

Ежемесячная сумма в сводной таблице


Ребята у меня есть вопрос я пробовал так много вещей serached в google нашел что то но не для меня так что вопрос в том что я хочу сделать выбор который будет получать сумму значений и получать ее ежемесячно то есть больше чем
@veriable(data)
значение около 12 месяцев только Су я написал какой-то код , но не работает для меня, пожалуйста, помогите мне кто-нибудь

Что я уже пробовал:

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @cols2 AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)
DECLARE @year DATE

SET @year='2017-04-01 00:00:00.000'
SELECT @cols = STUFF(
                        (   SELECT DISTINCT ',' + CONVERT(NVARCHAR(20),DATENAME(MONTH, Date))
 FROM dbo.Reestr LEFT JOIN dbo.Source AS j ON Sender_Id=j.ID 
WHERE (Date BETWEEN @year and dateadd(month,12,@year ))

 AND (Op_Type_Id=1 OR Op_Type_Id=3 OR Op_Type_Id=5)
GROUP BY SOURCE,DATENAME(MONTH, Date)	 
                            FOR xml path('')
                        )
                        , 1
                        , 1
                        , '')

						SELECT @cols
SELECT @query = 
'DECLARE @year DATE

SET @year=''2017-04-01 00:00:00.000''
SELECT *
FROM (SELECT   j.Source,
       DATENAME(MONTH, Date) [Month],
     ISNULL(SUM(Value), 0) AS value
      FROM dbo.Reestr LEFT JOIN dbo.Source AS j ON Sender_Id=j.ID WHERE 
	  (Date BETWEEN @year and dateadd(month,12,@year ))
	   AND (Op_Type_Id=1 OR Op_Type_Id=3 OR Op_Type_Id=5)
	   GROUP BY SOURCE,Value,
	 DATENAME(MONTH, Date)) mon 
PIVOT 
(
    sum(value)
    FOR [Month] IN  (' + @cols + ')) Piv'



EXEC SP_EXECUTESQL @query

Maciej Los

Какой движок базы данных?

GTR0123

Sql Server 2012

1 Ответов

Рейтинг:
6

Maciej Los

Проверить это:

--define fiscal year start and end
DECLARE @fiscalYearStart DATE = CONVERT(DATE, '2017-04-01')
DECLARE @fiscalYearEnd DATE = DATEADD(MM, 12, @fiscalYearStart)
--variable to store column names: [2017-04-01],[2017-05-01],[2017-06-01],...
DECLARE @cols NVARCHAR(2000) = N'';
--recursive query to produce column names
;WITH Dates AS
(
	SELECT @fiscalYearStart AS CommonDate
	UNION ALL
	SELECT DATEADD(MM, 1, CommonDate) AS CommonDate
	FROM Dates
	WHERE DATEADD(MM, 1, CommonDate)<@fiscalYearEnd
)
SELECT @cols = STUFF((SELECT '],[' + CONVERT(NVARCHAR(10),CommonDate) 
	FROM Dates
	FOR XML PATH('')), 1, 2, '') + ']'

--variable to store pivot query
DECLARE @qry NVARCHAR(MAX) = N'SELECT ' + @cols + 
    ' FROM (' + 
    '    SELECT j.[Value], CAST(DATEADD(DAY,-DAY(j.[Date])+1, CAST(j.[Date] AS DATE)) AS DATE) AS CommonMonthDate' + 
    '    FROM FROM dbo.Reestr AS r LEFT JOIN dbo.Source AS j ON r.Sender_Id=j.ID' +
    '    WHERE r.Op_Type_Id IN(1, 3, 5)' +
    ') AS DT' +
    'PIVOT(SUM(Value) FOR CommonMonthDate IN(' + @cols + ')) AS PVT'

EXEC(@qry)


Примечание: пожалуйста, измените псевдонимы таблиц (j или r) соответственно!

Я действительно использовал умный трюк от: sqlauthority.com: SQL SERVER – скрипт для поиска первого дня текущего месяца[^] чтобы преобразовать каждую дату в общую форму: первый день в месяце, чтобы иметь возможность сводить данные ежемесячно.


GTR0123

Тай Тай это снова помогает таю

Maciej Los

Всегда пожалуйста.
Вы можете сказать "спасибо" через систему голосования, дав мне звезды (1-плохой ответ, 5-Отличный) в правом верхнем углу моего ответа.

Karthik_Mahalingam

5

Maciej Los

Спасибо, Картик.