簡體   English   中英

即使當天/星期/月份沒有數據也返回結果

[英]return a result even if there is no data for that day/ week/ month

我有一個MSSQL數據庫,我想在單獨的查詢中獲取每天/每周/每月的值。

除了沒有數據的時間間隔之外,我的工作正常,它不會返回任何內容。 而且由於我將其放在圖表中,因此我希望它至少顯示0或NULL,而不是跳幾天或幾周等。

我不知道每個查詢是否會有所不同,但這是我的日常查詢:

select CAST(Placements.CreatedOn AS DATE) AS 
date,SUM(Placements.CommissionPerc * (Placements.PlacementFee / 100)) AS value 
from [placements] 
where [Placements].[CreatedOn] >= '2018-06-07' and [Placements].[CreatedOn] < '2018-06-12' 
group by CAST(Placements.CreatedOn AS DATE) 
order by CAST(Placements.CreatedOn AS DATE) ASC

返回的結果如下:

結果

因此,當數據實際為0時,它返回0,但是當數據丟失時,則沒有第9、10和12天的數據

我怎樣才能解決這個問題? 謝謝

使用遞歸CTE,您可以生成日期列表。
然后可以將其用於左聯接表。

例:

WITH DATES2018 AS
(
  SELECT CAST('2018-01-01' AS DATE) AS [date]

  UNION ALL

  SELECT DATEADD(day, 1, [date])
  FROM DATES2018
  WHERE [date] < CAST('2018-12-31' AS DATE)
)
SELECT 
d.[Date],
SUM(p.CommissionPerc * (p.PlacementFee / 100.0)) AS [value] 
FROM DATES2018 AS d
LEFT JOIN [Placements] AS p ON CAST(p.CreatedOn AS DATE) = d.[Date]
WHERE d.[Date] BETWEEN '2018-06-07' AND '2018-06-11' 
GROUP BY d.[Date]
ORDER BY d.[Date] ASC
OPTION (MAXRECURSION 366)

但是您也可以只添加一個包含所有日期的新永久表。
並使用該表離開您的表。

順便說一句,如果將變量用於開始和結束日期,則可以優化該SQL。

DECLARE @StartDate DATE = '2018-06-07';
DECLARE @EndDate DATE = '2018-06-11';

WITH DATES AS
(
  SELECT @StartDate AS [date]

  UNION ALL

  SELECT DATEADD(day, 1, [date])
  FROM DATES
  WHERE [date] < @EndDate
)
SELECT 
d.[Date],
SUM(p.CommissionPerc * (p.PlacementFee / 100.0)) AS [value] 
FROM DATES AS d
LEFT JOIN [Placements] AS p 
  ON p.CreatedOn BETWEEN CAST(@StartDate AS DATETIME) AND CAST(DATEADD(day, 1, @EndDate) AS DATETIME) AND
     CAST(p.CreatedOn AS DATE) = d.[Date]
GROUP BY d.[Date]
ORDER BY d.[Date] ASC
OPTION (MAXRECURSION 0)

最好使用永久日歷表,但這是使用CTE創建LEFT JOIN所需日期的示例。 這最多使用1,000天,但可以根據需要延長。

DECLARE 
      @StartDate date = '2018-06-07'
    , @EndDate date = '2018-06-12';
WITH 
     t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
    ,t1k AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) - 1 AS num  FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c)
    ,calendar AS (SELECT DATEADD(day, num, @StartDate) AS calendar_date
        FROM t1k
        WHERE num <= DATEDIFF(day, @StartDate, @EndDate)
        )
SELECT
      calendar.calendar_date AS date
    , SUM( COALESCE(Placements.CommissionPerc * (Placements.PlacementFee / 100),0 ) ) AS value 
FROM calendar
LEFT JOIN [placements] ON [Placements].[CreatedOn] = calendar.calendar_date
GROUP BY calendar.calendar_date
ORDER BY calendar.calendar_date ASC;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM