请考虑该表,称为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;
...但是我不知道如何将每个水果的平均值分成一列。谢谢!
答案 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);