如何将一列的平均值分成多列?

时间:2019-02-06 21:54:27

标签: sql google-bigquery

请考虑该表,称为fruit_sales。每行是一个要购买的水果的实例,列为:

  • 购买发生的日期
  • 水果的种类
  • 它的价格

例如:

| Day | Item   | Price |
|=====|========|=======|
| 01  | Apple  | 1.5   |
| 03  | Apple  | 1     |
| 01  | Apple  | 3     |
| 02  | Banana | 2     |
| 01  | Apple  | 1.5   |
| 02  | Apple  | 2     |
| 01  | Banana | 1     |
| 01  | Banana | 1.5   |

我想导出一个表格,其中每一行都是一天,列为:

  • 一天
  • 当天苹果的平均价格
  • 当天香蕉的平均价格

例如:

| Day | Avg Apple $ | Avg Banana $ |
|=====|=============|==============|
| 01  | 2           | 1.25         |
| 02  | 2           | 2            |
| 03  | 1           | 0            |

我可以创建一个查询来计算按天分组的每小时所有个水果的平均价格:

SELECT Day, AVG(price) FROM `fruit_sales` GROUP BY Day;

...但是我不知道如何将每个水果的平均值分成一列。谢谢!

3 个答案:

答案 0 :(得分:3)

以下是用于BigQuery标准SQL

  #standardSQL
  SELECT Day, 
    IFNULL(AVG(IF(Item = 'Apple', Price, NULL)), 0) AS `Avg_Apple`,
    IFNULL(AVG(IF(Item = 'Banana', Price, NULL)), 0) AS `Avg_Banana`
  FROM `project.dataset.table`
  GROUP BY Day

您可以使用问题中的示例数据来测试,玩游戏,如下例所示

  #standardSQL
  WITH `project.dataset.table` AS (
    SELECT '01' Day, 'Apple' Item,  1.5 Price UNION ALL
    SELECT '03', 'Apple',  1 UNION ALL
    SELECT '01', 'Apple',  3 UNION ALL
    SELECT '02', 'Banana', 2 UNION ALL
    SELECT '01', 'Apple',  1.5 UNION ALL
    SELECT '02', 'Apple',  2 UNION ALL
    SELECT '01', 'Banana', 1 UNION ALL
    SELECT '01', 'Banana', 1.5 
  )
  SELECT Day, 
    IFNULL(AVG(IF(Item = 'Apple', Price, NULL)), 0) AS `Avg_Apple`,
    IFNULL(AVG(IF(Item = 'Banana', Price, NULL)), 0) AS `Avg_Banana`
  FROM `project.dataset.table`
  GROUP BY Day
  -- ORDER BY Day

有结果

Row Day Avg_Apple   Avg_Banana   
1   01      2.0     1.25     
2   02      2.0     2.0  
3   03      1.0     0.0  

答案 1 :(得分:0)

您只需要按日分组,还需要除日

喜欢 SELECT Day, ITEM,AVG(price) FROM fruit_sales GROUP BY Day, ITEM ;这将平均每天向您显示每个项目

答案 2 :(得分:0)

您没有真正指定要使用的数据库。 Mikhail的答案非常适合标准SQL,但是如果您使用的是SQL Server 2005+,则可以使用PIVOT函数将数据从行转换为列。预先知道水果列表很容易,但是要获取动态列,您需要从水果列表中生成动态SQL。

declare @cols as nvarchar(max),
@query  as nvarchar(max)

select @cols = stuff((select ',' + quotename(Item) 
                from fruit_sales
                group by Item
                order by Item
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'select [Day],' + @cols + ' from 
         (
            select [Day], Item, Price
            from fruit_sales
        ) x
        pivot 
        (
            Avg(Price)
            for Item in (' + @cols + ')
        ) p '

execute(@query);