[英]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.