繁体   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