2015-06-30 8 views
4

Я хочу показать таблицу, что месяцы вертикальны, а годы горизонтальны, я даю ввод года и месяца из раскрывающегося списка. Мой ожидаемый результат ниже:месяц и год мудрый отчет

 2011 2012 2013 2014 
jan 1000 1500 5000 1000 
feb 00 00 2000 2000 
mar . 
.  . 
.  . 
dec . 

Мой запрос

select 
    datepart(year, DateOfTransaction), 
    left(datepart(month, DateOfTransaction), 3), 
    sum(amount) 
from TBL_Transactionmaster 
where 
    datepart(year, DateOfTransaction) = 'input year' 
    and datepart(month, DateOfTransaction) = 'input month' 
+1

вы можете использовать Pivot для этого. –

+0

yep.But месяц показывается по горизонтали –

ответ

5

Попробуйте этот запрос.

Для статического Pivot

SELECT * 
    FROM (
     SELECT 
      left(datename(month,DateOfTransaction),3)as [month], year(DateOfTransaction) as [year] 
      , Amount 
     FROM TBL_Transactionmaster 
    ) as s 
    PIVOT 
    (
     SUM(Amount) 
     FOR [Year] in([2011],[2012],[2013],[2014],[2015]) 
    )AS piv 

Для Dynamic Pivot

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(DateOfTransaction)) 
        from TBL_Transactionmaster 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT [Month],' + @cols + ' from 
      (
       SELECT 
      left(datename(month,DateOfTransaction),3)as [month], year(DateOfTransaction) as [year] 
      , Amount 
     FROM TBL_Transactionmaster 
      ) x 
      pivot 
      (
       sum(amount) 
       for [year] in (' + @cols + ') 
      ) p ' 

execute(@query) 

** Для все Месяца и заменить Null с 0 **

SELECT [month], Isnull([2011],0) as [2011] , ISnull([2012],0) as [2012] ,ISNULL ([2013],0) as [2013] , ISNULL([2014],0) as [2014] , ISNULL([2015],0) as [2015] 
    FROM (
     SELECT 
      left(datename(month,DateOfTransaction),3)as [month], Amount, year(DateOfTransaction) as [year] 

     FROM TBL_Transactionmaster 
     UNION ALL 
    select [MONTH], Amount, [year] FROM 
    (Select 'Jan' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
    Select 'Feb' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
     Select 'Mar' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
     Select 'Apr' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
     Select 'May' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
     Select 'Jun' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
      Select 'Jul' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
      Select 'Aug' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
      Select 'Sep' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
      Select 'Oct' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
       Select 'Nov' as [Month] , 0 as Amount, year(Getdate()) as [year] Union ALL 
       Select 'Dec' as [Month] , 0 as Amount, year(Getdate()) as [year]) MN 

    ) as s 
    PIVOT 
    (
     SUM(Amount) 
     FOR [Year] in([2011],[2012],[2013],[2014],[2015]) 
    )AS piv 
+0

Привет, arun, Static - это хорошо, но кто-то транзакции в текущем году, то как это будет показано. Моя таблица во все годы транзакций показывают динамически –

+0

Просто добавьте '[2011], [2012 ], [2013], [2014], [2015] 'статический запрос. проверьте мой обновленный ответ. –

+0

Для динамического запроса, где я помещаю свой год и месяц ввода –

2

Вы можете использовать запрос вроде этого:

SELECT DATENAME(MONTH, DateOfTransaction) As [Month] 
    , SUM(CASE WHEN DATEPART(YEAR, DateOfTransaction) = 2011 THEN amount ELSE 0 END) AS [2011] 
    , SUM(CASE WHEN DATEPART(YEAR, DateOfTransaction) = 2012 THEN amount ELSE 0 END) AS [2012] 
    , SUM(CASE WHEN DATEPART(YEAR, DateOfTransaction) = 2013 THEN amount ELSE 0 END) AS [2013] 
    , SUM(CASE WHEN DATEPART(YEAR, DateOfTransaction) = 2014 THEN amount ELSE 0 END) AS [2014] 
FROM TBL_Transactionmaster 
GROUP BY DATENAME(MONTH, DateOfTransaction), DATEPART(MONTH, DateOfTransaction) 
ORDER BY DATEPART(MONTH, DateOfTransaction) 

Вы можете использовать динамический SQL, как это:

DECLARE @sql nvarchar(max); 

SELECT @sql = ISNULL(@sql, 'DATENAME(MONTH, DateOfTransaction) As [Month]') + ', SUM(CASE WHEN DATEPART(YEAR, DateOfTransaction) = ' + 
       CAST(DATEPART(YEAR, DateOfTransaction) AS VARCHAR(5)) + ' THEN amount ELSE 0 END) AS [' + CAST(DATEPART(YEAR, DateOfTransaction) AS varchar(5)) + ']' 
FROM TBL_Transactionmaster 
GROUP BY DATEPART(YEAR, DateOfTransaction) 
ORDER BY DATEPART(YEAR, DateOfTransaction); 

SET @sql = 'SELECT ' + @sql + ' FROM TBL_Transactionmaster GROUP BY DATENAME(MONTH, DateOfTransaction), DATEPART(MONTH, DateOfTransaction) ORDER BY DATEPART(MONTH, DateOfTransaction)'; 

EXEC(@sql); 
+0

Static - это хорошо, но кто-то транзакции в текущем году, то как это будет показано. Моя таблица во все годы транзакций демонстрируется динамически –

+1

@ManoJohnbritto Вы можете использовать динамический SQL;). –

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