Sql 在列下返回零
如果表中没有可用于构建器的数据,我希望列流量为“零”。我原以为Sql 在列下返回零,sql,postgresql,Sql,Postgresql,如果表中没有可用于构建器的数据,我希望列流量为“零”。我原以为coalesce能让我达到目的,但我失败了。任何建议 select "Builder", coalesce("Traffic", 0) from table where "Week" = '05/15/2005' 查询时的结果: select "Builder" "Traffic" from table where "Week" = '05/15/2005' Builder Traffic Mike
coalesce
能让我达到目的,但我失败了。任何建议
select "Builder", coalesce("Traffic", 0)
from table
where "Week" = '05/15/2005'
查询时的结果:
select "Builder" "Traffic"
from table
where "Week" = '05/15/2005'
Builder Traffic
Mike 10
Tom 15
Me 5
预期结果:
Builder Traffic
Jake 0
Mike 10
Tom 15
Me 5
COALESCE
对空值有效,但是如果没有返回任何行,则永远不会调用COALESCE
你的“杰克”一定来自某个地方。假设您有一个名为builder\u names
的所有可能构建器的表,您可以使用左[OUTER]联接使其工作:
select b."Builder", coalesce(t."Traffic", 0) AS "Traffic"
from builder_names b
left join tbl t ON t.builder = b.builder -- or some id?
AND t."Week" = '05/15/2005';
你评论道:
杰克在表格中,但由于他没有本周的相应数据,因此被排除在外
那么这将有助于:
select "Builder"
, max(CASE WHEN "Week" = '05/15/2005' THEN "Traffic" ELSE 0 END) AS "Traffic"
from tbl
group by "Builder";
假设:
- 您希望每个名称有一行
- “流量”是数值大于0的数字数据类型
如果每个构建器可以有多行,并且希望返回这些行,则需要不同的方法。你的问题在细节上有点浅薄
无论哪种方式,第一种解决方案都更可取。对于大表,干净、规范化的模式要快得多
旁白:我不会使用混合大小写标识符,我更喜欢使用标准ISO 8601格式的日期文字('2015-12-15'
),这对于任何区域设置都是明确的。COALESCE
适用于空值,但如果根本没有返回行,则永远不会调用COALESCE
你的“杰克”一定来自某个地方。假设您有一个名为builder\u names
的所有可能构建器的表,您可以使用左[OUTER]联接使其工作:
select b."Builder", coalesce(t."Traffic", 0) AS "Traffic"
from builder_names b
left join tbl t ON t.builder = b.builder -- or some id?
AND t."Week" = '05/15/2005';
你评论道:
杰克在表格中,但由于他没有本周的相应数据,因此被排除在外
那么这将有助于:
select "Builder"
, max(CASE WHEN "Week" = '05/15/2005' THEN "Traffic" ELSE 0 END) AS "Traffic"
from tbl
group by "Builder";
假设:
- 您希望每个名称有一行
- “流量”是数值大于0的数字数据类型
如果每个构建器可以有多行,并且希望返回这些行,则需要不同的方法。你的问题在细节上有点浅薄
无论哪种方式,第一种解决方案都更可取。对于大表,干净、规范化的模式要快得多
旁白:我不会使用混合大小写标识符,我更喜欢使用日期文字的标准ISO 8601格式('2015-12-15'
),这与任何区域设置都是明确的。注释后:
如果需要所需的输出,则必须更改表结构
如果您只有一个存储销售的表,在Jake有一次销售之前,您无法检索Jake信息
如果您有两个表,如下所示:
Table CUSTOMERS
id int
name varchar(20)
1, 3, 10, '05/15/2005'
2, 2, 15, '05/15/2005'
3, 4, 5, '05/15/2005'
使用这些行:
1 Jake
2 Tom
3 Mike
4 Me
和另一个名为SALES的表,该表使用此结构
id int
fk_customer int
Traffic int
Week datetime
填写如下:
Table CUSTOMERS
id int
name varchar(20)
1, 3, 10, '05/15/2005'
2, 2, 15, '05/15/2005'
3, 4, 5, '05/15/2005'
要完成问题,必须编写以下查询:
SELECT (SELECT COALESCE(s.traffic,0) FROM sales s WHERE s.fk_customer = c.id)
FROM customers c
评论后:
如果需要所需的输出,则必须更改表结构
如果您只有一个存储销售的表,在Jake有一次销售之前,您无法检索Jake信息
如果您有两个表,如下所示:
Table CUSTOMERS
id int
name varchar(20)
1, 3, 10, '05/15/2005'
2, 2, 15, '05/15/2005'
3, 4, 5, '05/15/2005'
使用这些行:
1 Jake
2 Tom
3 Mike
4 Me
和另一个名为SALES的表,该表使用此结构
id int
fk_customer int
Traffic int
Week datetime
填写如下:
Table CUSTOMERS
id int
name varchar(20)
1, 3, 10, '05/15/2005'
2, 2, 15, '05/15/2005'
3, 4, 5, '05/15/2005'
要完成问题,必须编写以下查询:
SELECT (SELECT COALESCE(s.traffic,0) FROM sales s WHERE s.fk_customer = c.id)
FROM customers c
请发布您的数据集和表结构您有一个名为Mike、Jake、Tom、Me的父表?它只是一个表。Jake这周没有销售,所以他被排除在外。如果只有一个表,那么Jake没有行,那么您的查询如何输出Jake 0行?或者Traffic field counts sales number?这就是问题所在,我如何为他打印“0”值。可能吗?请发布您的数据集和表结构您有一个名为Mike、Jake、Tom、Me的父表?它只是一个表。Jake这周没有销售,所以他被排除在外。如果只有一个表,那么Jake没有行,那么您的查询如何输出Jake 0行?或者Traffic field counts sales number?这就是问题所在,我如何为他打印“0”值。有可能吗?谢谢欧文,杰克也在同一张表中,但因为他没有本周的相应数据,所以他被排除在外。我想在他的名字旁边加一个零。可能吗?如果本周没有Jake的值,那么就不会有任何行,因此“Jake”-行也不能有空值,因为TrafficYes Traffic是整数。我应用了第二个查询,它现在为所有构建器返回一个零。@PythonLearner:对,你需要max()
而不是min()
。但是如果JAKE不在该表中(永远不要为他出售),你就无法提取JAKE 0。不是@pythonlearnernerthanks-Erwin的标准化结构,Jake在同一个表中,但由于他没有本周的相应数据,因此被排除在外。我想在他的名字旁边加一个零。可能吗?如果本周没有Jake的值,那么就不会有任何行,因此“Jake”-行也不能有空值,因为TrafficYes Traffic是整数。我应用了第二个查询,它现在为所有构建器返回一个零。@PythonLearner:对,你需要max()
而不是min()
。但是如果JAKE不在该表中(永远不要为他出售),你就无法提取JAKE 0。不是@PythonLearner的标准化结构