2016-09-16 75 views
2

我們每個月都會獲得一批新的小部件。我們知道這些小部件的產品代碼是庫存,正在等待使用。每個人都有一個可用日期,之後可以使用。使用具有子查詢的聚合函數

表WidgetStock

色譜柱:爲widgetid,AvailabilityDate,

另一個表具有窗口小部件,即,所述的用途時,首先,使用它。

表WidgetsUsed

列:日期時間,操作員

我想白天小時,我已經使用首次新鮮部件的數量看,自啓動月份。小部件將被多次使用,所以每小時一次簡單的不同計數是不夠的,因爲小部件將被重複計數。

在我看來,這需要查看可用數字的列表,這些數字是通過查詢爲組中的每一行更新的。

下面的查詢將不能工作,但希望它說明了什麼我想實現:

declare @StartofMonth datetime 
set @StartofMonth = '20160901' 

select CONVERT(varchar, wu.datetime, 103)'Date' 
    , convert(char(2), wu.datetime, 108)'Hour' 
    --Problem Line below 
    , SUM(case when wu.StockNo in (select ba.NUMBER 
           from widgetStock ba 
           where availability_date between CONVERT(varchar, wu.datetime, 103) and @StartofMonth) then 1 else 0 end) 'Number Used' 
from widgetsUsed wu 
    left join widgetStock ws on wu.StockNo = ws.NUMBER 
where wu.OPERATOR = 'WidgetWorld' 
    and DATETIME between '20160914' and '20160916' 
group by CONVERT(varchar,wu.datetime,103), convert(char(2), wu.datetime, 108) 

任何幫助表示讚賞。提前致謝。

+5

樣本數據和預期的結果做解釋很多問題奇觀。 –

+0

@tompreston你會得到什麼錯誤? –

+0

@JibinBalachandran「無法對包含聚集或子查詢的表達式執行聚合函數」。 – User632716

回答

0

如果將其理解然後在下面的腳本您的要求可能會解決你的問題

declare @StartofMonth datetime 
set @StartofMonth = '20160901' 

select CONVERT(varchar, wu.datetime, 103)'Date' 
    , convert(char(2), wu.datetime, 108)'Hour' 
    , SUM(ISNULL(ba.NUMBER,0)) 'Number Used' 
from widgetsUsed wu 
left join widgetStock ws on wu.StockNo = ws.NUMBER 
LEFT JOIN widgetStock ba ON wu.StockNo = ba.NUMBER AND availability_date between CONVERT(varchar, wu.datetime, 103) and @StartofMonth 
where wu.OPERATOR = 'WidgetWorld' 
and DATETIME between '20160914' and '20160916' 
group by CONVERT(varchar,wu.datetime,103), convert(char(2), wu.datetime, 108)