如何计算SQL中的平均值?

时间:2017-12-19 15:44:47

标签: sql sql-server average

假设我有下表:

**FOOD**  | **AMOUNT**
  Bread   |   2
  Banana  |   5
  Pizza   |   4
  Apple   |   57
  Mandarin|   9
  Orange  |   8

最终结果:

  Bread  |  Percentage Of Total
  Banana |  percentage of total

等 等

我尝试过各种方式,但无法找到解决方案。我希望有人可以帮助我。

5 个答案:

答案 0 :(得分:2)

使用ANSI SQL(和SQL Server支持此语法),您可以执行以下操作:

select food, sum(amount),
       sum(amount) / sum(sum(amount)) over () as proportion_of_total
from t
group by food;

注意:某些数据库会执行整数除法,因此您可能需要转换为浮点或固定点类型。

答案 1 :(得分:1)

我们也可以尝试如下 -

DECLARE @tbl AS TABLE 
(
     food VARCHAR(15)
    ,amount INT
)

INSERT INTO @tbl VALUES
('bread', 2)
,('banana', 5)
,('pizza', 4)
,('apple', 57)
,('mandarin', 9)
,('orange', 8)

SELECT
    DISTINCT 
     food
    ,SUM(amount) OVER() TotalAmount
    ,SUM(amount) OVER (PARTITION BY food) PerFoodTotal
    ,CAST(SUM(amount) OVER (PARTITION BY food) * 100. / (SUM(amount) OVER()) AS DECIMAL(10,2)) [Percentage Of Total]
FROM @tbl

输出

food            TotalAmount PerFoodTotal Percentage Of Total
--------------- ----------- ------------ ---------------------------------------
apple           85          57           67.06
banana          85          5            5.88
bread           85          2            2.35
mandarin        85          9            10.59
orange          85          8            9.41
pizza           85          4            4.71

(6 row(s) affected)

答案 2 :(得分:0)

您可以尝试这样的事情:

declare @tbl as table (
    food varchar(15)
    ,amount int
)

insert into @tbl values
('bread', 2)
,('banana', 5)
,('pizza', 4)
,('apple', 57)
,('mandarin', 9)
,('orange', 8)


select SUM(amount) from @tbl


select
    food
    ,SUM(amount) as [food amount]
    ,(SUM(cast(amount as numeric(18,2))) / (select sum(cast(amount as numeric(18,2))) from @tbl)) * 100  as [Percentage Of Total]
    ,(select sum(amount) from @tbl) as total
from @tbl
group by food

答案 3 :(得分:0)

这里有一个获得PercentageOfTotal的方法,假设所有的总和都不是0

DECLARE @total INT = (SELECT SUM(AMOUNT) FROM Table1)

SELECT FOOD, CAST((CAST((100 * AMOUNT) AS DECIMAL (18,2)) / @total  ) AS DECIMAL(18,2)) AS PercentageOfTotal from Table1

答案 4 :(得分:0)

SQL Fiddle

MS SQL Server 2014架构设置

CREATE TABLE MusicGenres (name varchar(10)) ;
INSERT INTO MusicGenres (name)
VALUES ('Pop'),('Techno'),('Trance'),('trap'),('Hardcore'),('Electro') ;

CREATE TABLE Table2 (SongID int, MusicGenres varchar(10)) ;
INSERT INTO Table2 (SongID, MusicGenres)
VALUES (1,'Hardcore')
   ,(2,'Hardcore')
   ,(3,'Pop')
   ,(4,'Trap')
   ,(5,'Hardcore')
   ,(6,'Pop')
   ,(7,'Electro')
   ,(8,'Electro')
   ,(9,'Pop')
   ,(10,'Pop')
   ,(11,'Pop')
 ;

查询1

SELECT s1.name
  , s1.recCount
  , ( s1.recCount / CAST( ( SUM(recCount) OVER() ) AS decimal(5,2) ) )*100  AS pct
FROM (
    SELECT m.name
      , count(t.SongID) AS recCount
    FROM MusicGenres m
    LEFT OUTER JOIN Table2 t ON m.name = t.MusicGenres
    GROUP BY m.name
) s1

可以缩短为

SELECT m.name
  , count(t.SongID) AS recCount
  , ( count(t.SongID) / CAST( ( SUM(count(t.SongID)) OVER() ) AS decimal(5,2) ) 
)*100  AS pct
FROM MusicGenres m
LEFT OUTER JOIN Table2 t ON m.name = t.MusicGenres
GROUP BY m.name

<强> Results

|     name | recCount |     pct |
|----------|----------|---------|
|  Electro |        2 | 18.1818 |
| Hardcore |        3 | 27.2727 |
|      Pop |        5 | 45.4545 |
|   Techno |        0 |       0 |
|   Trance |        0 |       0 |
|     trap |        1 |  9.0909 |