在列下返回零

时间:2016-12-15 22:48:33

标签: 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          10
 Tom           15
 Me            5

期望的结果:

Builder         Traffic
Jake            0
Mike            10
Tom             15
Me              5

3 个答案:

答案 0 :(得分:2)

COALESCE适用于NULL值,但如果没有行,则永远不会调用COALESCE

你的'杰克'必须来自某个地方。假设您有一个名为builder_names的所有可能构建器的表,您可以使用LEFT [OUTER] JOIN

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'),这与任何语言环境设置都是明确的。

答案 1 :(得分:1)

评论后:

如果您需要所需的输出,则必须更改表格结构。

如果您只有一个存储销售的表,那么在Jake有一次销售之前您无法检索Jake信息。

如果你有两张表,如下:

Table CUSTOMERS
id int
name varchar(20)

使用这些行:

1 Jake
2 Tom
3 Mike
4 Me

另一个名为SALES的表具有此结构

id int
fk_customer int
Traffic int
Week datetime

填充如下:

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

答案 2 :(得分:1)

Declare @table_Name table (Name varchar(200))
Insert Into @table_Name (Name)
Values('Jake'), ('Tom'),('Mike'),('Me')

Declare @table2 table (Id int Identity, Builder varchar(200), Traffic int, [Date] Date)
Insert Into @table2 (Builder,Traffic,[Date])
 Values ('Mike', 10, '05/15/2005'),
('Tom', 15, '05/15/2005'),
('Me', 5, '05/15/2005')

Select      D1.Name, Isnull(D2.Traffic,0) as Traffic
From        @table_Name D1
Left Join   @table2 D2
    On      D1.Name = D2.Builder