Sql 在没有传递行的情况下填充0值
我试图找到没有传递的实例,并将值返回为0,但是由于传递为0,因此当天没有数据行 这是一个简单的查询,可以在交付时提取数据Sql 在没有传递行的情况下填充0值,sql,google-bigquery,bigquery-standard-sql,Sql,Google Bigquery,Bigquery Standard Sql,我试图找到没有传递的实例,并将值返回为0,但是由于传递为0,因此当天没有数据行 这是一个简单的查询,可以在交付时提取数据 select date(timestamp_micros(delivered_on)) as day, coalesce(delivery,0) as value from delivery_table 我所希望的是以下几点: **day |value** 8/10/19 |123 8/11/19 |456 8/12/19 |0 我的
select
date(timestamp_micros(delivered_on)) as day,
coalesce(delivery,0) as value
from
delivery_table
我所希望的是以下几点:
**day |value**
8/10/19 |123
8/11/19 |456
8/12/19 |0
我的实际结果是:
**day |value**
8/10/19 |123
8/11/19 |456
您可以使用一个日历表来存储您希望在报告中显示的所有日期。大概是这样的:
WITH dates AS (
SELECT '2019-08-10' AS dt UNION ALL
SELECT '2019-08-11' UNION ALL
SELECT '2019-08-12'
)
SELECT
d.dt,
COALECSE(t.value, 0) AS value
FROM dates
LEFT JOIN delivery_table t
ON d.dt = t.day;
实际上,您可能不会使用CTE作为日历表,而是生成一个日期序列,或者只是创建一个包含实际日期的真实表。您可以使用一个日历表来存储您希望在报告中显示的所有日期。大概是这样的:
WITH dates AS (
SELECT '2019-08-10' AS dt UNION ALL
SELECT '2019-08-11' UNION ALL
SELECT '2019-08-12'
)
SELECT
d.dt,
COALECSE(t.value, 0) AS value
FROM dates
LEFT JOIN delivery_table t
ON d.dt = t.day;
实际上,您可能不会使用CTE作为日历表,而是生成一个日期序列,或者只是创建一个包含实际日期的真实表。使用
生成日期数组()
使用生成日期数组()
:
您将需要创建一个临时表,其中包含日期列表和左连接
,否则,如果没有相应的行可供选择,则无法在结果集中获取行。您需要创建一个临时表,其中包含日期列表,并将其左键连接到您的交货表中,否则,如果没有相应的行可供选择,则无法在结果集中获取行。生成日期表似乎是一种非常低效的方法。我将声明一个临时int,并通过插入dates DATEADD(day,@Startdate,@DateIndex)
(实际代码当然取决于RDM)。@daShier我只使用了一个CTE来简化查询的解释。如前所述,在BigQuery(或任何其他版本的SQL)中有更好的方法生成日历表。生成日期表似乎是一种非常低效的方法。我将声明一个临时int,并通过插入dates DATEADD(day,@Startdate,@DateIndex)
(实际代码当然取决于RDM)。@daShier我只使用了一个CTE来简化查询的解释。如前所述,在BigQuery(或任何其他版本的SQL)中有更好的方法生成日历表。