我希望得到这个问题的答案。
我正在使用SQL Developer编写连接到Oracle数据库的查询。我需要的是,如果查询结果为空(我猜是null或0),我仍然需要显示一些内容。截至目前,当查询结果为空时,只有列标题出现。
以下代码是我迄今为止所尝试过的,但没有成功。
SELECT
to_char(rs.cr_date, 'MM/DD/YYYY') "Date",
COUNT(os.ord_id) "RTS Returned Orders"
FROM return_sku rs,
order_sku os
WHERE
rs.s_method Like '%RTS%'
AND trunc(created_date) = trunc(SYSDATE)
AND os.ord_sku_id = rs.ord_sku_id
GROUP BY to_char(rs.cr_date, 'MM/DD/YYYY')) rts
当s_method列中存在“RTS”时,此工作正常;如,在我的查询结果中会出现一个数字。问题是当没有查询结果,其中rs.s_method中包含“RTS”时,我的查询只返回列标题而没有其他内容(见下文)。
Date | RTS Returned Orders
------------------------------
我需要它,以便当s_method中没有“RTS”的结果时,它将在“RTS返回的订单”列中返回一个日期和数字0的行。如下所示:
Date | RTS Returned Orders
------------------------------
12/4/2013 | 0
我尝试过使用解码和NVL无济于事。要么我没有正确使用它们,要么我可以使用其他我不知道的东西。
请帮忙!提前致谢。非常感谢任何帮助。
最诚挚的问候,
-Anthony C。
答案 0 :(得分:2)
我认为您想要的查询使用条件聚合,而不是在where
子句中进行过滤:
SELECT to_char(rs.cr_date, 'MM/DD/YYYY') as "Date",
sum(case when rs.s_method Like '%RTS%' then 1 else 0 end) as "RTS Returned Orders"
FROM return_sku rs join
order_sku os
on os.ord_sku_id = rs.ord_sku_id
WHERE trunc(created_date) = trunc(SYSDATE)
GROUP BY to_char(rs.cr_date, 'MM/DD/YYYY');
注意一些事情。 group by
是不必要的,因为你只返回一行(但我将它留在原因,因为它是原始问题的一部分)。我还修复了join
语法以使用标准连接语法(join
... on
)而不是隐式连接。
答案 1 :(得分:1)
你可以这样做:
select "date", sum('MM/DD/YYYY') "Date")
from
(select to_char(sysdate, 'MM/DD/YYYY') "Date"
, 0 "'MM/DD/YYYY') "Date"
from dual
union
SELECT
to_char(rs.cr_date, 'MM/DD/YYYY') "Date",
COUNT(os.ord_id) "RTS Returned Orders"
FROM return_sku rs,
order_sku os
WHERE
rs.s_method Like '%RTS%'
AND trunc(created_date) = trunc(SYSDATE)
AND os.ord_sku_id = rs.ord_sku_id
GROUP BY to_char(rs.cr_date, 'MM/DD/YYYY')) rts
) temp
不确定所有引用别名的语法,但总体思路应该有用。
答案 2 :(得分:0)
您可以使用子查询。
这将是伪代码。
选择检查columnA是否为null,然后显示备用值 从 (从当前查询中选择columnA)作为MyQuery
答案 3 :(得分:0)
WITH os_counts AS (
SELECT COUNT(rs.ord_id) AS "RTS Returned Orders",
os.ord_id
FROM order_sku os
LEFT OUTER JOIN
( SELECT ord_id
FROM return_sku
WHERE s_method LIKE '%RTS%'
) rs
ON ( os.ord_sku_id = rs.ord_sku_id )
AND TRUNC(created_date) = TRUNC(SYSDATE)
GROUP BY
os.ord_id
)
SELECT TO_CHAR( NVL( rs.cr_date, SYSDATE ), 'MM/DD/YYYY') "Date",
"RTS Returned Orders"
FROM os_counts os
LEFT OUTER JOIN
return_sku rs
ON ( os.ord_sku_id = rs.ord_sku_id );
我不知道您的created_date
列所在的哪个表格,因此您可能需要移动该声明。
较低的LEFT OUTER JOIN
可能是INNER JOIN
,但我不知道您的表格结构和依赖关系。