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