SQL - 平均值和分组

4

我有以下表格:

Date      |   Product   |   Price 
06-12-17  |    1.1      |   10
06-12-17  |    1.2      |   20
06-12-17  |    1.3      |   30
06-12-17  |    1.4      |   40
05-12-17  |    1.1      |   20
05-12-17  |    1.2      |   20
05-12-17  |    1.3      |   40
05-12-17  |    1.4      |   40

我很难在SQL Server中找到一个可以给我这个结果的查询:

Date      |   Product |   Price 
06-12-17  |    1      |   25
05-12-17  |    1      |   30

我希望每天得到每个产品的平均价格。

产品范围从1.1到24.4。


提示:Group By - Sankar
3
产品输出全部为1的逻辑是什么? - Tim Biegeleisen
1.1 = 一小时一刻钟 1.2 = 一小时二刻钟我想要每小时的平均数。 - milanDD
1
你使用哪种 SQL 数据库? - Sankar
我会考虑修复你的“产品”列的数据模型。 - Evaldas Buinauskas
4个回答

6

如果您只需要产品的左部分,将product转换为int,然后使用结果值和date进行聚合。

select date, 
       cast(product as int) as product, 
       avg(price) as Price
from table1
group by date, cast(product as int)

结果:

date        product Price
--------------------------
05-12-17    1       30
06-12-17    1       25

演示


更新:

如果产品是varchar数据类型,请使用cast两次。

select date, 
       cast(cast(product as dec(3,1)) as int) as product, 
       avg(price) as Price
from table1
group by date, cast(cast(product as dec(3,1)) as int)

Varchar() 数据类型演示


我收到了以下错误信息:“将varchar值'24,4'转换为数据类型int时转换失败。” - milanDD
啊,所以你的列数据类型是 varchar,这很遗憾。在这种情况下,你需要先将其转换为 decimal,然后再转换为 int。在这种情况下,请检查更新后的答案。 - zarruq
嵌套类型转换? - milanDD
仍然收到此错误消息“将数据类型varchar转换为numeric错误” - milanDD
原始表中的“Product”列是VARCHAR(10),但我将选择语句放入一个视图中,其中“Product”列是dec(38,6)。出于某种原因,在视图中放置您的代码会产生相同的错误消息。 - milanDD
显示剩余3条评论

2

根据您想要的输出结果,有不同的选择。

  • FLOOR() 取每个数字的下限整数
  • cast(product as int) 转换为整数

查询语句:

 SELECT
  Date,
  FLOOR(product) product, // This function can be replaced with above according to the output
  AVG(price) price

FROM your_table
GROUP BY date, FLOOR(product) order by Date

根据您所说的输出错误,您也可以尝试以下方法。

 SELECT
  Date,
  FLOOR(convert(float, product)) product, // This function can be replaced by FLOOR(cast(product as float))
  AVG(price) price

FROM your_table
GROUP BY date, FLOOR(convert(float, product)) order by Date;

获取以下错误信息:“将数据类型 varchar 转换为 float 时出错”。 - milanDD
虽然它在我的系统上运行正常,但如果不行的话,你可以尝试使用更新的代码。 - A.D.

0
假设每个产品值都有一个“.”(点)。否则从第2行中删除-1。
SELECT Date,
   LEFT(CAST(product AS VARCHAR),charindex ('.',product) - 1),
   AVG(price)
FROM TABLE
GROUP BY Date, LEFT(CAST(product AS VARCHAR),charindex ('.',product) - 1);

成功了!只需要将“Group by”更改为“按日期分组,LEFT(CAST(product AS VARCHAR), CHARINDES(',', product)-1)”即可。 - milanDD
感谢您。为了以后的参考,已经进行了更正。 - penguin

0

试试这个:

     SELECT date,cast(product AS int) product,avg(Price) Price FROM (
     SELECT * FROM (VALUES 
     (cast('06-12-17' as date) ,    1.1      ,   10)
     ,(cast('06-12-17' as date) ,    1.2      ,   20)
     ,(cast('06-12-17' as date) ,    1.3      ,   30)
     ,(cast('06-12-17' as date) ,    1.4      ,   40)
     ,(cast('05-12-17' as date) ,    1.1      ,   20)
     ,(cast('05-12-17' as date) ,    1.2      ,   20)
     ,(cast('05-12-17' as date) ,    1.3      ,   40)
     ,(cast('05-12-17' as date) ,    1.4      ,   40)) a(Date      ,   
     Product   ,   Price ))x
     GROUP BY date,cast(product AS int)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接