簡體   English   中英

即使數據庫中不存在記錄,如何檢索默認值

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

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