2017-06-20 40 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