使用带有子查询的聚合函数

时间:2016-09-16 11:08:38

标签: sql sql-server sql-server-2008

我们每个月都会获得一批新的小部件。我们知道这些小部件的产品代码是库存,等待使用。每个都有一个可用日期,之后可以使用它。

  

表格WidgetStock

     

列:WidgetID,AvailabilityDate,

另一个表具有窗口小部件的用途,即首次使用它时。

  

Table WidgetsUsed

     

列:datetime,Operator

我希望每天和每小时都能看到自本月初以来我第一次使用的新鲜小部件的数量。小部件将被多次使用,因此按小时计算一个简单的独特计数是不够的,因为小部件将被重复计算。

在我看来,这需要查看可用数字列表,该列表会根据查询为每一行更新。

以下查询不起作用,但希望它能说明我想要实现的目标:

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)

对此有任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分: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)