0

查询数据如下所示,数据库中没有 2021-10-03 天的记录。

日期 价值
2021-10-01 100
2021-10-02 90
2021-10-04 10
2021-10-05 40

我想使用 as 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

4

2 回答 2

0

我在下面找到了答案运行命令。与此不同的是,在这个新版本中,我删除了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
于 2021-10-24T13:14:49.550 回答
-1

您可以使用公用表表达式(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。

于 2021-10-24T04:11:59.003 回答