Home Forums SQL Server 2008 T-SQL (SS2K8) Pivot Rows to Columns with UnEven amounts of Rows based on Monthly Dates RE: Pivot Rows to Columns with UnEven amounts of Rows based on Monthly Dates

  • I hope this will help you. You just need to complete the rest of the months with Copy-Paste-Replace.

    WITH CTE AS(

    SELECT TOP 12 DATEADD( mm, (ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) -1) * -1, DATEADD( mm, DATEDIFF( mm, 0, GETDATE()), 0)) period

    FROM sys.all_columns

    ),

    Data AS(

    SELECT period,

    P.SPRSNSLN AS SPRSNSLN,

    ISNULL( Cur.MonthlyGP, 0) MonthlyGP,

    ISNULL( Cur.MonthlyRev, 0) MonthlyRev,

    ISNULL( Cur.MonthlyGP, 0) - ISNULL( Prev.MonthlyGP, 0) AS MonthlyYOYGPDiff,

    ROW_NUMBER() OVER( PARTITION BY P.SPRSNSLN ORDER BY period) MonthNo

    FROM CTE

    CROSS

    JOIN (SELECT DISTINCT SPRSNSLN

    FROM GPByMonth) P

    LEFT

    JOIN GPByMonth Cur ON Cur.M = MONTH( period)

    AND Cur.Y = YEAR( Period)

    AND P.SPRSNSLN = Cur.SPRSNSLN

    LEFT

    JOIN GPByMonth Prev ON Prev.M = MONTH( period)

    AND Prev.Y = YEAR( Period) - 1

    AND P.SPRSNSLN = Prev.SPRSNSLN

    )

    SELECT SPRSNSLN,

    MAX( CASE WHEN MonthNo = 1 THEN period END) AS GPDate_CY1,

    MAX( CASE WHEN MonthNo = 1 THEN DATEADD( YEAR, -1, period) END) AS GPDate_PY1,

    SUM( CASE WHEN MonthNo = 1 THEN MonthlyGP END) AS MonthlyGP_1,

    SUM( CASE WHEN MonthNo = 1 THEN MonthlyRev END) AS MonthlyRev_1,

    SUM( CASE WHEN MonthNo = 1 THEN MonthlyYOYGPDiff END) AS MonthlyYOYGPDiff_1,

    MAX( CASE WHEN MonthNo = 2 THEN period END) AS GPDate_CY2,

    MAX( CASE WHEN MonthNo = 2 THEN DATEADD( YEAR, -1, period) END) AS GPDate_PY2,

    SUM( CASE WHEN MonthNo = 2 THEN MonthlyGP END) AS MonthlyGP_2,

    SUM( CASE WHEN MonthNo = 2 THEN MonthlyRev END) AS MonthlyRev_2,

    SUM( CASE WHEN MonthNo = 2 THEN MonthlyYOYGPDiff END) AS MonthlyYOYGPDiff_2,

    MAX( CASE WHEN MonthNo = 3 THEN period END) AS GPDate_CY3,

    MAX( CASE WHEN MonthNo = 3 THEN DATEADD( YEAR, -1, period) END) AS GPDate_PY3,

    SUM( CASE WHEN MonthNo = 3 THEN MonthlyGP END) AS MonthlyGP_3,

    SUM( CASE WHEN MonthNo = 3 THEN MonthlyRev END) AS MonthlyRev_3,

    SUM( CASE WHEN MonthNo = 3 THEN MonthlyYOYGPDiff END) AS MonthlyYOYGPDiff_3

    FROM Data

    GROUP BY SPRSNSLN

    ORDER BY SPRSNSLN

    Luis C.
    General Disclaimer:
    Are you seriously taking the advice and code from someone from the internet without testing it? Do you at least understand it? Or can it easily kill your server?

    How to post data/code on a forum to get the best help: Option 1 / Option 2