Я создаю динамический запрос, чтобы получить весь месяц, который попадает между двумя диапазонами дат, и поворачиваю его как столбец месяца.
Я пытался использовать поворот и получить столбец Динамический месяц, но главная проблема в том, что я не могу суммировать все значения, попадающие в этот месяц. пожалуйста, смотрите ниже код и ожидаемый результат.
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](https://i.stack.imgur.com/ZDo78.png)
Здесь март, апрель, май - это динамические столбцы, поэтому я не могу сделать сумму по этим трем столбцам.