Quantcast
Channel: Transact-SQL forum
Viewing all articles
Browse latest Browse all 23857

Regarding Dynamic PIVOT in SQL Server 2005

$
0
0
i rare use PIVOT in sql server but now requirement is something that i have to use PIVOT.

my table structure is something like

CurDate               Warranty_Info
-------               -------------
01/01/2009                50
01/05/2009                30
01/03/2009                220
01/01/2010                40
01/06/2010                10
01/02/2010                0
01/01/2011                10
01/05/2012                420
01/05/2013                130

now i have to show the data in this way

Month     2009     2010    2011    2012   2013
-----     ----     ----    ----    ----   -----
JAN        10       0       11      32      98
FEB        20       10      21      11      44
MAR        0        224     33      77      31

UPTO

DEC

1) data should display month wise order....so jan first 2) if no data exist in any month then month name will come with 0 as value for that month.

i tried but fail. here is my sql by which i tried.

  SELECT *
  FROM (SELECT DateName(month,DateAdd(month,Month(CurDate),-1))  as [Month],
        YEAR(CurDate) AS WarrantyYear,
        Warranty_Info
        FROM eod_main) AS D
  PIVOT (
    SUM(Warranty_Info)
    FOR WarrantyYear IN (
      [2009],[2010],[2011],[2012],[2013]
    )
  ) AS P
  ORDER BY DATENAME(MONTH,DATEADD(MONTH, [Month] - 1, 0))

and i tried to generate sql dynamically this way.

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @PivotTableSQL NVARCHAR(MAX)

DECLARE @StartYear AS INT,
        @EndYear  AS INT

SET @StartYear=2009
SET @EndYear=2013

select @cols = STUFF((SELECT  ',' + QUOTENAME(Year(CurDate))
                    from eod_main
                    WHERE Year(CurDate)>=@StartYear AND Year(CurDate) <=@EndYear
                    group by Year(CurDate)
                    order by Year(CurDate)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')



SET @PivotTableSQL = N'
  SELECT * FROM (
  SELECT Month(CurDate), YEAR(CurDate) AS WarrantyYear,Warranty_Info FROM eod_main) AS D

  PIVOT (
    SUM(Warranty_Info)
    FOR WarrantyYear IN (
      ' + @cols + '
    )
  ) AS PivotTable
'
print @PivotTableSQL

but some where i am facing problem like 1) display month name 2) order by month no 3) null value show show 0 instead of NULL 4) if no data exist for any month then month name should display with 0 value.

please guide me how to achieve it. thanks

Viewing all articles
Browse latest Browse all 23857

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>