当count使用1个表返回null时显示所有行[重复]
Posted
技术标签:
【中文标题】当count使用1个表返回null时显示所有行[重复]【英文标题】:show all rows when count return null using 1 table [duplicate] 【发布时间】:2015-08-11 16:32:22 【问题描述】:所以我有一个表格筛选:
Name Null? Type
--------------------------------------- -------- -------------
SCREENINGNO NOT NULL VARCHAR2(8)
CINEMANO VARCHAR2(8)
MOVIENO VARCHAR2(8)
SUPERVISORNO VARCHAR2(8)
CAMERAOPNO VARCHAR2(8)
HOURSTART NUMBER(38)
SCREENINGDATE DATE
问题是“显示 2015 年每个月安排的放映次数。”
我试过了:
SELECT to_char(s1.screeningdate, 'mm') AS month
,count(s2.screeningno) AS number_of_times_screened
FROM screening s1
,screening s2
WHERE s1.movieno(+) = s2.movieno
AND to_char(s1.screeningdate, 'yy') = '15'
GROUP BY to_char(s1.screeningdate, 'mm')
ORDER BY to_char(s1.screeningdate, 'mm');
它返回了:
MO NUMBER_OF_TIMES_SCREENED
-- ------------------------
01 22
02 31
03 24
04 32
05 26
06 37
07 15
08 15
10 10
11 5
12 8
已选择 11 行。
它只返回 11 行,我也需要它来显示 9 月。有人可以帮忙吗?
【问题讨论】:
如果您需要任何帮助,您可能需要提供示例数据。另外,请检查您的表格中是否有 9 月份的任何数据。 使用分区外连接,如***.com/questions/11254121/…。它专为这种情况而设计。 【参考方案1】:这样做的一种方法是使用 dual
psedotable 和 connect by level
子句来生成 1 到 12 之间的所有数字,并将其加入到放映计数中:
SELECT d.month, cnt
FROM (SELECT LPAD(LEVEL, 2, '0') AS month
FROM dual
CONNECT BY LEVEL <= 12) d
LEFT JOIN (SELECT TO_CHAR(screeningdate, 'mm') AS month, COUNT(*) AS cnt
FROM screeninginfo
WHERE TO_CHAR(screeningdate, 'yy') = '15'
GROUP BY TO_CHAR(screeningdate, 'mm')) s ON d.month = s.month
ORDER BY 1 ASC
【讨论】:
看起来不错。可能需要对个位数月份的加入条件进行一些调整。例如,对于 1 月份,连接条件将尝试将'1'
连接到 '01'
。
@sstan 很好,谢谢 - 我已经编辑了我的答案以使用 lpad
而不是天真的 to_char
来解决这个问题。以上是关于当count使用1个表返回null时显示所有行[重复]的主要内容,如果未能解决你的问题,请参考以下文章