2016-04-23 47 views
1

我们记录每个销售产品的每小时销售量。在一小时内没有产品销售的情况下,没有记录。我们正在尝试创建一个查询,告诉我们每件产品每天销售的最小数量。我们的工作正常,但我们不知道如何处理在一个或多个小时内没有记录,从而使正确结果为零的情况。基本上,我们的查询永远不会返回零,因为它会在至少有一次销售的记录中选择最小数量。如何在没有记录存在的情况下按组条件返回零

请注意,所有时间戳都在每小时的开始;分钟和秒始终为0

我们的查询到目前为止是这样的:

SELECT activity_time 
     ,min(hourly_quantity) AS daily_min_quantity 
     ,product_name 
FROM (select cast(quantity_time AS date) AS quantity_time 
      ,sum(hourly_quantity) AS hourly_quantity 
      ,product_name 
     FROM Hourly_Sales 
     GROUP BY activity_time,product_name) x 
group by activity_time,product_name 

我想我们需要做的要么在子查询的小时数,以确保有24个和如果没有,返回零,但我不知道如何做到这一点。

+0

这甚至不是一个有效的查询 – Paparazzi

回答

1

您需要一个最外层的选择,将您的产品的明确清单和LEFT JOIN返回给您的销售数据。每个含有NULL作为销售数据的产品都是不存在销售的产品。使用ISNULLCOALESCE来解决这个问题。

如果你提供你的(缺失)表(特别是产品的一些详细信息,我可以帮你进一步...

0

既然你是“activity_time,PRODUCT_NAME”在你的子查询分组,然后再次在你的查询“activity_time,product_name”(我猜你忘了把activity_time放在子查询的SELECT部分​​中)是不是从SUM和MIN聚合中获得相同的结果?

1

另一种方法来创建的“每期结果”式报表是使用日期时间表(或CTE)创建一组日期时间,然后LEFT JOIN这些查询和ISNULL应用默认值。

日期&时间表做出这种事情方便,快捷,但这里是一个使用CTE和15分钟的报告期伪TSQL版本:

DECLARE @StartDate DATETIME2 = '2016-01-01 00:00:00'; 
DECLARE @EndDate DATETIME2 = '2016-01-31 23:45:00'; 
DECLARE @Period INT = 15; 

WITH Dates AS 
(
    SELECT @StartDate DatePeriod 
    UNION ALL 
    SELECT DATEADD(MINUTE, @Period, D.DatePeriod) Date FROM Dates D 
    WHERE D.DatePeriod < @EndDate 
) 
SELECT D.DatePeriod 
    ,ISNULL(MyColumn1, 0) MyColumn1 
    --etc 
FROM Dates D 
    LEFT JOIN (
     --SELECT GOES HERE 
    ) MyData ON MyData.SomeDateTime = D.DatePeriod 
OPTION(MAXRECURSION 0) 
相关问题