Среднее количество строк в SQL Server - PullRequest
0 голосов
/ 15 января 2019

У меня есть таблица ниже

Col1  Col2  Col3  Col4   Col5
TotalAvg 68.79 65.39 88.21  63.14

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

Я ищу

Select Avg(Col2,Col3,Col4,Col5)
    where Col1 = 'TotalAvg'

Спасибо

Ответы [ 2 ]

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

Если некоторые из них могут иметь значения NULL, вы все равно можете использовать AVG() внутри APPLY.

SELECT
  yourTable.Col1,
  RowStats.avg
FROM
  yourTable
CROSS APPLY
(
  SELECT
    AVG(x) AS avg
  FROM
  (
    SELECT yourTable.col2   AS x
    UNION ALL
    SELECT yourTable.col3   AS x
    UNION ALL
    SELECT yourTable.col4   AS x
    UNION ALL
    SELECT yourTable.col5   AS x
  )
    pivot
)
  AS rowStats
0 голосов
/ 15 января 2019

Если случайно вам нужен более динамичный подход (то есть переменные столбцы), и ЕСЛИ вы открыты для TVF, подумайте о следующем:

EDIT

1-й параметр - это список столбцов с разделителями, которые необходимо исключить. Например: 'IDNr,Year,AnyOtherNumericCol'.

Пример

Select A.* 
      ,B.*
 From  YourTable A
 Cross Apply [dbo].[tvf-Stat-Row-Agg]('',(Select A.* for XML Raw)) B

Возвращает

Col1        Col2    Col3    Col4    Col5    RetCnt  RetSum  RetMin  RetMax  RetAvg  RetStd
TotalAvg    68.79   65.39   88.21   63.14   4       285.53  63.14   88.21   71.3825 11.4562162892757

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  = convert(varchar(100),xAttr.query('local-name(.)'))
                  ,Value = try_convert(float,xAttr.value('.','varchar(max)'))
             From  @XML.nodes('//@*') x(xAttr)
          ) S
    Where charindex(','+S.Item+',',','+@Exclude+',')=0
);

РЕДАКТИРОВАТЬ 2

Если столбцы фиксированы, а производительность имеет первостепенное значение, то ...

Select A.* 
      ,B.*
 From  YourTable A
 Cross Apply (
               Select AvgVal = avg(Value)
                 From (values (Col2)
                             ,(Col3)
                             ,(Col4)
                             ,(Col5)
                      ) B1(Value)
             ) B
...