2014-12-04 60 views
0

我正在研究基於日期列中的值對SQL表中的數據執行一些算術除法的SQL查詢。在SQL表中按日期字段中的天數除數值

爲了詳細說明,我有以下SQL表預訂

id Date  Type Quantity Price 
3 2014-11-04 Sweet 2500 23  
9 2014-12-04 Sweet 5000 30  
10 2014-12-04 Midale 2500 25.4  
11 2014-11-04 Sweet 5000 45  

現在,我想按類型和日期分組對數量列了一些算術運算。

我用下面的查詢

SELECT 
    Type, 
    COUNT(Id) AS Trades, 
    SUM(Quantity) AS M3, 
    ROUND((6.2898*SUM(Quantity))/31,4) AS BBLperDay, 
    CAST(Date as date) AS TradeMonth, 
    ROUND(SUM(Quantity*Price)/Sum(Quantity),4) AS WeightedAverage 
FROM Deals 
GROUP BY 
    Type,CAST(Date as date) 

上述查詢返回

Type Trades  M3  BBLperDay TradeMonth 
    Sweet 2  7500 1521.7258 2014-11-04 
    Midale 1  2500 507.2419 2014-12-04 
    Sweet 1  5000 1014.4839 2014-12-04 

上述結果是正確的,但我在表達式硬編碼的天數爲31中的日期

6.2898*SUM(Quantity)/31 AS BBLperDay 

有沒有一種方法我可以做的只是從日期列中取得一個基於月份的值。如果月份是日期列中的十二月份,則該值將自動爲31,因爲十二月份的天數爲31.

+1

您正在使用什麼版本的SQL Server?在較新的版本中,有一個函數(['EOMONTH()'](http://technet.microsoft.com/en-us/library/hh213020.aspx))會給你一個給定月份的天數。 – alroc 2014-12-04 21:43:45

回答

3

要找到否。在一個月

Select DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,getdate()),0))) 

或幾天如果您正在使用SQL SERVER 2012+

Select DAY(EOMONTH(getdate())) 

更改您這樣的查詢。

SELECT 
    Type, 
    COUNT(Id) AS Trades, 
    SUM(Quantity) AS M3, 
    ROUND((6.2898*SUM(Quantity))/DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,TradeMonth),0))),4) AS BBLperDay, 
    CAST(Date as date) AS TradeMonth, 
    ROUND(SUM(Quantity*Price)/Sum(Quantity),4) AS WeightedAverage 
FROM Deals 
GROUP BY 
    Type,CAST(Date as date),TradeMonth 
相關問題