2016-04-23 80 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) 
相關問題