2016-08-24 1 views
1

У меня проблема с получением итогового столбца из моего динамического сводного запроса. Из моего кода я получил этот результат: the result without total , я хочу общую колонку из колонки 32,33,34,35 и поместить его после того, как колонны 35 (вертикальный общий столбец)SQL Get Total Column from Dynamic Pivot

Вот мой код:

SET DATEFIRST 1; 
    DECLARE @cols AS NVARCHAR(MAX), 
    @colNames AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(DATEPART(wk,OINV.TaxDate)) 
      FROM OINV 
      WHERE YEAR(OINV.TaxDate) = 2016 AND MONTH(OINV.TaxDate) = 8 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SELECT @colNames = STUFF((SELECT DISTINCT ', ISNULL(' + QUOTENAME(DATEPART(wk,OINV.TaxDate)) +', 0) as '+ QUOTENAME(DATEPART(wk,OINV.TaxDate)) 
       FROM OINV 
       WHERE YEAR(OINV.TaxDate) = 2016 AND MONTH(OINV.TaxDate) = 8 
       FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SET @query = 'SELECT Salesman, Cabang, '+ @colNames +' 
      FROM(SELECT 
       OSLP.SlpName as Salesman, 
       OCRD.U_STEM_BP_WHSE as Cabang, 
       SUM(OINV.DocTotal) as Achiev, 
       DATEPART(wk,OINV.TaxDate) as WeekNo 
      FROM OINV 
       INNER JOIN INV1 ON INV1.DocEntry = OINV.DocEntry 
       INNER JOIN OSLP ON OINV.SlpCode = OSLP.SlpCode 
       INNER JOIN OITM ON INV1.ItemCode = OITM.ItemCode 
       INNER JOIN OMRC ON OITM.FirmCode = OMRC.FirmCode 
       INNER JOIN OCRD ON OINV.CardCode = OCRD.CardCode 
      WHERE 
       YEAR(OINV.TaxDate) = 2016 AND MONTH(OINV.TaxDate) = 8 
      GROUP BY 
       OSLP.SlpName, 
       OCRD.U_STEM_BP_WHSE, 
       OINV.TaxDate) AS a 
      PIVOT(SUM(Achiev) 
      FOR WeekNo IN (' + @cols + ')) AS pvt 
      ORDER BY Salesman ASC' 

EXECUTE(@query); 

Ваша помощь очень ценится, спасибо.

Используйте советы от @Anton, это обновленный результат я получил: the updated result

ответ

1

Изменить

SET @query = 'SELECT Salesman, Cabang, '+ @colNames +' 

Для

SET @query = 'SELECT Salesman, Cabang, '+ @colNames +', ' + @SumCol32_35 + ' 

@ SubCol32_35 должен быть как «[32] + [ 33] + [34] + [35] '

Вы можете жестко закодировать его, если имена колонок фиксированы или заполняются внутри

SELECT @colNames = 

с оператором CASE ... END для заполнения только соответствующих столбцов.

+0

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

+0

Не беспокойтесь, пожалуйста, отметьте ответ как «ответил». – Anton

+0

все в порядке, не проблема, но можете ли вы помочь мне еще один вопрос о моем комментарии выше? –