2017-06-20 81 views
0

我有一个表,看起来像这样的平均价格:SQL - 获取的最后7天

timestamp | commodity | amount | price | 

我试图得到一个商品的加权平均,每天从过去的7天(为了创建一个图形,C#程序),我成功地创建一个查询来获取的加权平均值:

SELECT SUM(price * amount), 
     SUM(amount) 
    FROM [table_name] 
WHERE (commodity = @commodity) 
    AND (timestamp >= @fromDate 
    AND timestamp <= @toDate); 

所以,我7次,每次加(-1)发送这个查询没有fromdate和toDate,得到最近7天的平均值。

我想问一下在1查询中是否有办法做到这一点,如果有,是否可以实现获取上个月的相同信息。

+0

您可以使用数据透视表。检查[这里](https://www.techonthenet.com/sql_server/pivot.php) – Badiparmagi

+0

请添加样本数据和预期结果 –

回答

1

您可以使用转换为日期,但代码如下:

SELECT convert(date, timestamp) as [Dates], 
     SUM(price * amount), 
     SUM(amount) 
    FROM [table_name] 
    WHERE (commodity = @commodity) 
    AND (timestamp >= @fromDate 
    AND timestamp <= @toDate) 
GROUP BY convert(date, timestamp) 
+0

谢谢!有没有办法为没有记录的日期设置默认值? –

+0

要生成日期,我在下面添加了另一个答案 –

0

,你必须按日期

SELECT SUM(price* amount),SUM(amount) FROM [table_name] WHERE (commodity = @commodity) AND (cast(timestamp as date)>= @fromDate AND cast(timestamp as date)<= @toDate) 
Group By cast(timestamp as date) 
0

你应该将你的数据按日期:

SELECT SUM(price * amount),SUM(amount) 
FROM [table_name] 
WHERE (commodity = @commodity) 
AND (timestamp >= @fromDate 
AND timestamp <= @toDate) 
GROUP BY CAST(timestamp as DATE); 
0

要生成日期,您可以使用如下:

;with Datescte as (
     Select top (datediff(day, @fromDate, @toDate) +1) Dt = Dateadd(day, Row_Number() over (order by (Select null))-1, @fromDate) 
     from master..spt_values s1, master..spt_values s2 
    ), cte2 as (
     SELECT convert(date, timestamp) as [Dates], 
      SUM(price * amount) as [Sum_Price_Amount], 
      SUM(amount) as [Sum_Amount] 
     FROM [table_name] 
     WHERE (commodity = @commodity) 
     AND (timestamp >= @fromDate 
     AND timestamp <= @toDate) 
    GROUP BY convert(date, timestamp) 
    ) 
     Select Dt as [Dates] , Sum_Price_Amount, Sum_Amount 
     FROM Datescte d 
     LEFT JOIN cte2 d2 
      ON d.Dt = d2.Dates