pivot în sql - generați coloana grandtotal din coloanele pivot

Sub interogare funcționează bine și obțin pivotul după cum este necesar. Valorile dolarului arată bine din ianuarie până în decembrie. Acum, cum aș adăuga o coloană totală care să-mi dea un total de rând din ianuarie până în decembrie? Din moment ce coloana din aceste luni este creata folosind pivot, nu sunt sigur cum sa adaugam valorile pentru toate lunile si sa afisem ca intr-o noua coloana. Ați putea să vă ajute? Dați-mi voie să știu dacă aveți nevoie de mai multe clarificări cu privire la ceea ce căut.

Mulțumesc anticipat!

CREATE TABLE #t
    (
        Region varchar(50),
        Area varchar(255),
        Market varchar(255),
        MediaType varchar(50),
        Campaign varchar(255),
        Description varchar(255),
        TotalCost money,
        MonthDesc nvarchar(50),
        [Year] int,
        MonthNumber int
    )
    DECLARE @List VARCHAR(8000), @SQL VARCHAR(8000)
    SET @List = ''
    SET @SQL = ''

    INSERT INTO #t
    SELECT 
        r.RegionName,
        d.DistrictName,
        dm.DMAName,
        mt.MediaTypeDesc,
        pn.PlanName,
        pd.VendorPreference,
        SUM(pd.DropAmount) AS TotalCost,
        DATENAME(MONTH, pd.StartDate),
        p.[Year],
        DATEPART(MONTH, pd.StartDate)
    FROM PlanDetails pd
    INNER JOIN Plans p ON p.PlanId = pd.PlanId
    INNER JOIN PlanNames pn ON pn.PlanNameId = p.PlanNameId
    INNER JOIN DMA_Plans dp ON p.PlanId = dp.PlanId
    INNER JOIN DMA dm ON dm.DMAId = dp.DMAId
    INNER JOIN Centers c ON c.DMAId = dm.DMAId
    INNER JOIN Districts d ON d.DistrictId = c.DistrictId
    INNER JOIN Regions r ON r.RegionId = d.RegionId
    INNER JOIN MediaTypes mt ON mt.MediaTypeId = pd.MediaTypeId
    WHERE   c.OrganizationId = 2
    AND     p.[Year] = @Year
    AND     pd.StartDate IS NOT NULL
    AND     p.Active = 1
    AND     c.DMAId IS NOT NULL
    AND     pd.MediaTypeId IS NOT NULL
    GROUP BY    r.RegionName,
                d.DistrictName,
                dm.DMAName,
                mt.MediaTypeDesc,
                pn.PlanName,
                pd.VendorPreference,
                pd.StartDate,
                p.[Year]

    DECLARE @TblY TABLE(ODate nvarchar(50), oYear int, oMonthOrder int)
    INSERT @TblY 
    SELECT  DISTINCT MonthDesc, [Year], MonthNumber FROM [#t] ORDER BY MonthNumber

    SELECT @List = ISNULL(@List,'') + CASE WHEN ISNULL(@List,'') = '' THEN '[' + ODate + ']' ELSE ',[' + ODate + ']' end
    FROM @TblY
    ORDER BY oMonthOrder

    SET @SQL = 'Select Region, Area, Market, MediaType, Campaign, Description, ' + @List + char(13) 
    SET @SQL = @SQL + 'From (Select Region, Area, Market, MediaType, Campaign, Description, MonthDesc, TotalCost ' + char(13) 
    SET @SQL = @SQL + 'FROM #t F) P ' + char(13) 
    SET @SQL = @SQL + 'Pivot (SUM(TotalCost) For MonthDesc In ('  + @List + ')) as Pvt' + char(13) 


    PRINT @SQL
    EXEC (@SQL)

    DROP TABLE #t
0

1 răspunsuri

Utilizați seturi de grupare sau CUBE

Seturile de grupare sunt, în principiu, mai multe grupuri după declarație. Combinați acest lucru cu tratarea pivotului dvs. ca o subselect și aveți o modalitate rapidă și ușoară de a realiza un total de agregate, toate în același set de rezultate

Mai multe informații despre seturile de gropi http://msdn.microsoft.com/en-us/library/bb522495.aspx http://blogs.msdn.com/b/sreekarm/archive/2008/12/28/grouping-sets-in-sql-server-2008.aspx

1
adăugat