SQL Server Pivot с общим итогом? - PullRequest
0 голосов
/ 25 января 2019

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

SELECT @PartiesNames +=  QUOTENAME(LTRIM(RTRIM([Party]))) + ',' 
        FROM table1 WHERE [Party] <> ''
        GROUP BY [Party]

SET @PartiesNames = LEFT(@PartiesNames, LEN(@PartiesNames) - 1)


SET @SQL =
    '
     SELECT * 
     FROM (SELECT 
                  table1.[Party]
                 ,table1.[Accounts]
                 ,[Amount] = FORMAT(SUM(table1.[Amount]),''N0'')
                 FROM  table1

                     GROUP BY table1.[Party]
                    ,table1.[Accounts]
                    ) AS BaseData

    PIVOT(
        MAX(BaseData.[Amount])
        FOR BaseData.[Party]
        IN(' + @PartiesNames + '     
        )
    ) AS PivotTable
    ' 

    EXEC( @SQL)

И я получаю обычную сводную таблицу, но мой вопрос, какя могу изменить этот код, чтобы получить новую строку или столбец с итогом?Я следил за этой статьей о том, как это сделать, но это довольно сложно: https://www.codeproject.com/Articles/232181/SQL-Pivot-with-Grand-Total-Column-and-Row

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

1 Ответ

0 голосов
/ 25 января 2019

Если вас интересует вспомогательная функция.

Эта табличная функция возвращает Count,Sum,Min,Max,Avg and STDev практически для любой строки.

Все, что вам нужно сделать, это добавить CROSS APPLY после вашегоPIVOT.

Я должен добавить, что вы должны " ИСКЛЮЧИТЬ " любой числовой столбец, который вы НЕ хотите в агрегатах

Пример

Declare @T1 Table ([Branch] varchar(50),[Item] varchar(50),[Sales] int)
Insert Into @T1 Values 
 ('23','Apples',25)
,('23','Coffee',56)
,('23','Bread',22)
,('14','Apples',56)
,('14','Coffee',65)
,('14','Bread',null)


Select Pvt.*
      ,Ttl.*
 From  @T1
 Pivot ( max(Sales) for Item in ([Apples],[Coffee],[Bread]) ) Pvt
 Cross Apply [dbo].[tvf-Stat-Row-Agg]('Branch,OtherColumsToExclude',(Select Pvt.* for XML Raw)) Ttl

Возвращает

/----     From Pivot    ----\  /----          From CROSS APPLY          ----\  

Branch  Apples  Coffee  Bread   RetCnt  RetSum  RetMin  RetMax  RetAvg  RetStd
14      56      65      NULL    2       121     56      65      60.5    6.3639
23      25      56      22      3       103     22      56      34.33   18.8237

TVF, если интересно

CREATE FUNCTION [dbo].[tvf-Stat-Row-Agg](@Exclude varchar(500),@XML xml)
Returns Table 
As
Return (  
    Select RetCnt = count(value) 
          ,RetSum = Sum(Value)
          ,RetMin = Min(Value)
          ,RetMax = Max(Value)
          ,RetAvg = Avg(Value)
          ,RetStd = Stdev(Value)
    From  (
            Select Item  = xAttr.value('local-name(.)','varchar(100)')
                  ,Value = try_convert(float,xAttr.value('.','varchar(max)'))
             From  @XML.nodes('//@*') x(xAttr)
          ) S
    Where charindex(','+S.Item+',',','+@Exclude+',')=0
);
...