我希望有一个零'如果表中的构建器没有可用数据,则在“流量”列中。我以为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
答案 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";
假设:
如果每个构建器可以有多个行,并且您希望它们返回,则需要采用不同的方法。你的问题对细节有点了解。
无论哪种方式,第一种解决方案都是可取的。使用大表,一个干净的,规范化的模式要快得多。
旁白:我不会使用混合大小写标识符,我更喜欢使用标准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