[英]How to retrieve default value even when do no exist record in database
如下圖查詢數據,數據庫中沒有2021-10-03日的記錄。
日期 | 價值 |
---|---|
2021-10-01 | 100 |
2021-10-02 | 90 |
2021-10-04 | 10 |
2021-10-05 | 40 |
我想使用 SELECT ... WHERE date BETWEEN '2021-10-01' AND '2021-10-05' 之間的日期來執行查詢,並且在特定日期不存在數據的情況下,檢索零作為舉例如下:
日期 | 價值 |
---|---|
2021-10-01 | 100 |
2021-10-02 | 90 |
2021-10-03 | 10 |
2021-10-04 | 10 |
2021-10-05 | 40 |
是否可以? 在大查詢中?
我嘗試了下面的查詢,但檢索到了重復的值。
WITH `project.myproject` AS (
SELECT
DATA_VENDA AS date,
CAST(SUM(VLR_VENDA_TABELA) AS FLOAT64) AS total,
FROM `project.myproject`
WHERE
(DATA_VENDA BETWEEN '2020-10-02'
AND '2020-10-07')
AND COD_CP = '0000010232'
GROUP BY
DATA_VENDA
ORDER BY
DATA_VENDA
),
dates AS (
SELECT total, date
FROM `project.myproject`, UNNEST(GENERATE_DATE_ARRAY(date('2020-10-02'), date('2020-10-07'))) AS date
)
SELECT d.date, IFNULL(t.total, 0) total
FROM dates d
LEFT JOIN `project.myproject` t
ON d.date = t.date
AND d.total = t.total
ORDER BY d.date
我在下面找到了運行命令的答案。 與此不同的是,在這個新的中,我刪除了一行AND d.total = t.total
,他負責創建重復數據。 最終答案如下:
WITH `project.myproject` AS (
SELECT
DATA_VENDA AS date,
CAST(SUM(VLR_VENDA_TABELA) AS FLOAT64) AS total,
FROM `project.myproject`
WHERE
(DATA_VENDA BETWEEN '2020-10-02'
AND '2020-10-07')
AND COD_CP = '0000010232'
GROUP BY
DATA_VENDA
ORDER BY
DATA_VENDA
),
dates AS (
SELECT total, date
FROM `project.myproject`, UNNEST(GENERATE_DATE_ARRAY(date('2020-10-02'), date('2020-10-07'))) AS date
)
SELECT d.date, IFNULL(t.total, 0) total
FROM dates d
LEFT JOIN `project.myproject` t
ON d.date = t.date
ORDER BY d.date
您可以簡單地使用公用表表達式 (CTE) 執行此操作,如下所示。
DECLARE @Datatemp TABLE (
Id INT IDENTITY(1,1) NOT NULL,
CDate DATETIME,
Val INT
)
INSERT INTO @Datatemp SELECT '2021-10-01',10
INSERT INTO @Datatemp SELECT '2021-10-02',50
INSERT INTO @Datatemp SELECT '2021-10-04',24
INSERT INTO @Datatemp SELECT '2021-10-05',18
;WITH DateTemp(Date) AS (
SELECT CAST('2021-10-01' AS DATETIME)
UNION ALL
SELECT [Date]+1
FROM DateTemp
WHERE [Date] < '2021-10-05'
)
SELECT DateTemp.[Date] CDat
,ISNULL(t.Val, 0) Val
FROM DateTemp
LEFT JOIN @Datatemp t ON t.CDate = DateTemp.[Date]
ORDER BY DateTemp.[Date]
--OPTION (MAXRECURSION 0)
默認情況下,遞歸CTE的迭代次數是100次。只要超過這個次數,就會中斷查詢並產生錯誤。 如果要取消此限制,可以指定 MAXRECURSION 0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.