Суммируйте значение столбца и покажите общее количество - PullRequest
0 голосов
/ 22 апреля 2019

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

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

DECLARE @PeriodStart DATETIME , @PeriodEnd DATETIME , @Advertiser INT , @status NVARCHAR(200) , @SellerID INT ,@ContractNumber NVARCHAR(20),@DMAID INT,@DMAName NVARCHAR(50)
SELECT @PeriodStart  ='03/14/2019', @PeriodEnd = '06/10/2019', @Advertiser =-1, @status ='Accepted', @SellerID =3632, @ContractNumber ='CR6362', @DMAID = 1,@DMAName='Abilene-Sweetwater, TX' --211405
DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)
SELECT @DMAName AS Market,CASE WHEN BD.TransactionType ='Print' THEN 'Production' WHEN BD.TransactionType ='Install' THEN 'Installation' ELSE BD.TransactionType END AS CostType,DATENAME(month, bD.PeriodFrom) AS MName,
CASE WHEN BD.LineItemStyle ='Face' THEN COALESCE(ISNULL(SF.SignCategory, SignCategory.Description),'') ELSE MediaType.Description END AS MediaType,
CASE WHEN BD.LineItemStyle ='Face' THEN COALESCE(SF.UnitSize, ' ') + COALESCE(CASE WHEN SF.Design = 1 THEN ' Digital '  ELSE '' END, ' ') + COALESCE(ISNULL(SF.SignCategory, SignCategory.Description),  '') 
ELSE COALESCE(bsCliv2.Size, ' ') + COALESCE(CASE WHEN bsCliv2.Digital = 1 THEN ' Digital ' ELSE '' END, ' ') + ISNULL(bsCliv2.Description,' ') END AS PanelSize,
CASE WHEN BD.LineItemStyle ='Face' THEN SF.ClientFaceID ELSE NULL END AS Panel#,
CASE WHEN BD.LineItemStyle ='Face' THEN SF.TabFaceID ELSE NULL END AS GeoPathID,
CASE WHEN BD.LineItemStyle ='Face' THEN 1 ELSE bsCliv2.Quantity END AS NumberOfUnits,
CASE WHEN BD.LineItemStyle ='Face' THEN SF.FromDate ELSE bsCliv2.FromDate END AS StartDate,
CASE WHEN BD.LineItemStyle ='Face' THEN SF.ToDate ELSE bsCliv2.ToDate END AS EndDate,
CASE WHEN BD.LineItemStyle ='Face' THEN CASE WHEN (SF.TimeUnit = 'Periods' OR SF.TimeUnit = 'Period') THEN '4 Weeks' ELSE SF.TimeUnit END
 ELSE CASE WHEN ( bsCliv2.TimeUnit = 'Periods' OR bsCliv2.TimeUnit = 'Period') THEN '4 Weeks' ELSE bsCliv2.TimeUnit END  END AS TermOfPeriod,
 CASE WHEN BD.LineItemStyle ='Face' THEN SF.TimeUnitCounts ELSE bsCliv2.TimeUnitCounts END AS NumberOfPeriods,
CASE WHEN BD.LineItemStyle ='Face' THEN SF.RatePerUnitGross ELSE bsCliv2.RateCostNet END AS NetCostPerPeriod,
(SELECT [dbo].[UF_CalculateTotalForDuration](CASE WHEN BD.LineItemStyle ='Face' THEN CASE WHEN (SF.TimeUnit = 'Periods' OR SF.TimeUnit = 'Period') THEN '4 Weeks' ELSE SF.TimeUnit END
 ELSE CASE WHEN ( bsCliv2.TimeUnit = 'Periods' OR bsCliv2.TimeUnit = 'Period') THEN '4 Weeks' ELSE bsCliv2.TimeUnit END  END,'',CASE WHEN BD.LineItemStyle ='Face' THEN SF.RatePerUnitGross ELSE bsCliv2.RateCostNet END
 ,CASE WHEN BD.LineItemStyle ='Face' THEN SF.FromDate ELSE bsCliv2.FromDate END,CASE WHEN BD.LineItemStyle ='Face' THEN SF.ToDate ELSE bsCliv2.ToDate END)) AS AgencyTotal
 ,BD.Amount
,(SELECT STUFF((SELECT
                            ','+QUOTENAME(c.Name)
                     FROM dbo.GetMonthList(@PeriodStart,@PeriodEnd) c ORDER BY c.[month]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')) AS MnthName
 INTO #tmp 
 FROM dbo.BillingDetail BD
INNER JOIN dbo.bsContractLineItemV2 bsCliv2 ON bsCliv2.ContractNumber = BD.ContractNumber AND bsCliv2.LineNumber = BD.LineNumber AND bsCliv2.LineItemStyle <> 'Section'
INNER JOIN dbo.bsContract ON bsContract.ContractNumber = BD.ContractNumber AND ( @status = 'All' OR  bsContract.ContractStatus IN (SELECT A.Data FROM fnc_Split(@status,',') A )) 
LEFT JOIN MediaType ON bsCliv2.MediaTypeID = MediaType.MediaTypeID
LEFT JOIN dbo.bsSelectedFace SF ON SF.ContractNumber = BD.ContractNumber AND SF.LineNumber = BD.LineNumber
LEFT JOIN Face F ON SF.FaceID = F.FaceID
LEFT JOIN dbo.Site ON Site.SiteID = F.SiteID
LEFT JOIN SignCategory ON F.SignCategoryID = SignCategory.SignCategoryID
LEFT JOIN dbo.DMA cliDMA ON cliDMA.ID = bsCliv2.DMA AND cliDMA.ID IS NOT NULL 
 WHERE BD.SellerID = @SellerID AND BD.PeriodTo > = @PeriodStart
                                    AND BD.PeriodFrom <= @PeriodEnd  AND bsCliv2.DMA= @DMAID



SELECT * INTO #tmp1 FROM(
SELECT  Market,CostType,MName,MediaType,PanelSize,Panel#,GeoPathID,NumberOfUnits,StartDate,EndDate,TermOfPeriod,CONVERT(NVARCHAR(50),NumberOfPeriods) AS NumberOfPeriods,NetCostPerPeriod,AgencyTotal,Amount,MnthName
        FROM    #tmp
        UNION ALL
        SELECT  Market = NULL ,
                CostType = NULL ,
                MName = NULL ,
                MediaType = NULL ,
                PanelSize = NULL,
                Panel# = NULL,
                GeoPathID = NULL,
                NumberOfUnits = NULL,
                StartDate = NULL,
                EndDate = NULL,
                TermOfPeriod = NULL,
                'Totals' AS NumberOfPeriods ,
                SUM(CONVERT(DECIMAL(18, 2), ISNULL(NetCostPerPeriod, 0))) AS NetCostPerPeriod ,
                SUM(CONVERT(DECIMAL(18, 2), ISNULL(AgencyTotal, 0))) AS AgencyTotal ,
                SUM(CONVERT(DECIMAL(18, 2), ISNULL(Amount, 0))) AS Amount ,
                MnthName = NULL
        FROM    #tmp) t


SET @cols = STUFF((SELECT
                            ','+QUOTENAME(c.Name)
                     FROM dbo.GetMonthList(@PeriodStart,@PeriodEnd) c ORDER BY c.[month]
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT Market,CostType,MediaType,PanelSize,Panel#,GeoPathID,NumberOfUnits,StartDate,EndDate,TermOfPeriod,NumberOfPeriods,NetCostPerPeriod,AgencyTotal,' + @cols + ' 
               FROM 
             (
                SELECT *
                FROM #tmp1
             ) dta
             PIVOT 
             (
                SUM(amount)
                FOR MName IN (' + @cols + ')
             ) pvt order by NumberOfPeriods'             
execute(@query);
DROP TABLE #tmp
DROP TABLE #tmp1

Result I get and expected result is displayed in this image please click it

Здесь март, апрель, май - это динамические столбцы, поэтому я не могу сделать сумму по этим трем столбцам.

...