المحور في sql - توليد عمود الجذور من أعمدة محورية

يعمل الاستعلام أدناه بشكل جيد وأحصل على الجدول المحوري كما هو مطلوب. المبالغ الدولار تظهر بشكل جيد من يناير إلى ديسمبر. الآن ، كيف أقوم بإضافة عمود إجمالي من شأنه أن يعطيني إجمالي الصف من يناير إلى ديسمبر؟ نظرًا لإنشاء عمود الأشهر هذا باستخدام المحور ، فأنا لست متأكدًا من كيفية إضافة القيم لجميع الشهور وعرضها في عمود جديد. هل باستطاعتك رجاءا المساعدة؟ اسمحوا لي أن أعرف إذا كنت بحاجة إلى مزيد من التوضيح حول ما أبحث عنه.

شكرا لك مقدما!

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 إجابة

استخدم مجموعات التجميع أو CUBE

مجموعات التجميع هي في الأساس مجموعة متعددة حسب العبارة. قم بدمج هذا مع معالجة المحور الخاص بك كاختيار ثانوي ولديك طريقة سريعة وسهلة لتحقيق مجموع aggregrate كلها في نفس مجموعة النتائج

مزيد من المعلومات عن مجموعات يتلمس 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
وأضاف