如何在没有查询结果时返回一个查询结果

3

我有一个名为“orders”的表格,其中包含以下数据:

   Date     Order_No     Ship_Method
-------------------------------------
12/6/2013   1234567       RTS
12/6/2013   7654321       
12/7/2013   3456789       RTS
12/7/2013   9876543       
12/7/2013   1123456       RTS
12/7/2013   5523847       RTS
12/8/2013   8876549    
12/8/2013   7733654

我需要一个查询来搜索在“Ship_Method”字段中有多少行数据包含“RTS”,并返回我运行查询的那一天的以下结果(如下所示):
   Date     RTS_Shipments
-------------------------
12/8/2013         0

-安东尼 C.

编辑

关于上述问题,适用于我的查询是以下内容(由答案部分的 Carth 提供):

select 
sub.tdate,
count(orders.dt)
from (select to_date(to_char((sysdate-1),'mmddYYYY'),'mmddYYYY') tdate from dual) sub
left join orders on sub.tdate = orders.dt and orders.ship_method like '%RTS%'
group by sub.tdate

在SQLFiddle上,我试图做这样的事情:SELECT CASE WHEN to_char(dt, 'MM/DD/YYYY') IS NULL THEN trunc(sysdate) ELSE to_char(dt, 'MM/DD/YYYY') END, CASE WHEN COUNT(ship_method) IS NULL THEN 0 ELSE COUNT(ship_method) END FROM orders WHERE trunc(dt) = trunc(SYSDATE - 1) AND ship_method Like '%RTS%' GROUP BY trunc(dt, 'MM/DD/YYYY');但是一直收到这个错误信息:ORA-00932:不一致的数据类型:期望DATE得到CHAR:SELECT CASE WHEN to_char... - aCarella
2个回答

2
为了得到你需要的结果,你需要创建一个基础选择条件,确保筛选条件已经存在,然后使用它来连接目标表格。在我最初的回答中,我认为你可以直接从双重表中选择一个变量值,但是由于我无法正确地处理语法,这里有几个其他的想法。你可以创建一个新的“工作”表格,其中包含你想要检查的所有日期,并对其进行选择和左连接到你的目标表格,或者你可以创建一个子查询来保存你想要的值,并将其用作你语句的基础,就像这样:
select 
  sub.tdate,
  count(orders.dt)
from (select to_date(to_char((sysdate-1),'mmddYYYY'),'mmddYYYY') tdate from dual) sub
left join orders on sub.tdate = orders.dt and orders.ship_method like '%RTS%'
group by sub.tdate

谢谢您的回复,@Carth。这段代码无法运行。当我在SQL Developer中运行它时,会收到以下消息:ORA-00936:缺少表达式 00936. 00000 - “missing expression” *原因: *操作: 错误发生在第1行第7列。 - aCarella
@aCarella - 我已经更新了答案,并提供了一个可行的示例。希望这能帮到你。 - Carth
@aCarella 只需将 to_date('120913','mmddYY') 替换为 SYSDATE。 - Carth
如果我想让它搜索昨天,我不是应该输入SYSDATE - 1吗?当我输入SYSDATE时,得到的结果是0,这是正确的,因为12/9没有任何条目。但是,当我输入SYSDATE - 1(或2或3)时,仍然得到零。此外,我在代码中没有看到任何搜索"RTS"的地方,它在ship_method列中。这个查询是我解决这个问题最接近的方法,但是如果有的话,我仍然需要它搜索给定日期中"RTS"字符串的数量。 - aCarella
@aCarella 这是因为你需要去掉日期中的时间部分。更新后的示例展示了如何在连接条件中进行筛选并从日期值中去掉时间部分。 - Carth
显示剩余3条评论

1
你可以在同一张表上使用左连接来获取所有结果和你需要的结果。你需要的那个结果加1,不需要的则加0。
就这样就行了。
 SELECT to_char(o1.DT, 'MM/DD/YYYY') As "Date", 
        SUM(case when o1.Ship_Method is null then 0 else 1 end) As RTS_Shipments
  FROM orders o1 
     left join orders o2 
        on (o1.dt = o2.dt and o2.Ship_Method like '%RTS%')
 WHERE trunc(o1.DT) = trunc(SYSDATE) 
 GROUP BY to_char(o1.DT, 'MM/DD/YYYY')

在fiddle上查看:http://sqlfiddle.com/#!4/fd374/6

我将日期字段更改为dt,因为date是保留字。

而且,此查询可以计算每个日期,但它只会显示您筛选的那一天的记录:trunc(o1.DT) = trunc(SYSDATE) 如果您删除此条件,则可以看到每个日期的正确计数。


OP需要返回一行,即使没有任何匹配where子句的内容。 - Carth
考虑到 OP 的评论“当某一天没有 RTS 发货时问题就出现了”,如果选择的是 12/9 而不是 12/8,那么在你的示例中会发生什么?或者反过来,如果您保留选择以查找 SYSDATE,但更改模式以将记录从 12/8 移动到 12/9,会发生什么? - Carth
@Carth,由于12/9日期没有数据sysdate上有一个过滤器,因此除非操作员创建一个包含所有日期的表并使用左连接与其表进行筛选以获取12/9日期,否则无法打印该行。 - Jorge Campos
到目前为止,我非常感谢大家的评论。这个问题的评论部分中没有任何代码是有效的。我已经在我使用的SQL Developer中尝试过了,但它并没有起作用。我还尝试了你发送的sqlfiddle.com链接,@Jorge Campos,但如果你尝试另一个日期(例如SYSDATE - 1或-2),它也不起作用,因为它会给出非常离谱的数字,比如9(甚至在给定的示例中都没有9个RTS字符串)。我会继续寻找答案,如果我找到了答案,我会发布它。如果有人能够解决这个问题,请发表回复。非常感谢。-安东尼 - aCarella
@aCarella,我认为你的问题没有解释清楚。你可以提供一个表格的样本数据,并从中提取所需的结果,这样更容易给你提供解决方案。 - Jorge Campos
样本数据将是我发布的第一个表格(订单)。期望的结果是,我想要一列日期,另一列是给定日期中ship_method中RTS字符串的数量。如果在该天的ship_method列中没有RTS字符串,则我希望计算RTS字符串数量的列显示“0”。我会在原始帖子中发表另一篇文章,以便更好地展示我的需求,@JorgeCampos。 - aCarella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接