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的标准化结构