选择列的Oracle组子集

时间:2018-12-12 05:19:23

标签: sql oracle

我有一列名为vs_tblRentals的列,其中包含以下列:

@CC_N

还有名为vs_tblBoxes的列,其中包含以下列

RENTALID    CUSTOMERID    BOXID    RENTALDATE       RETURNDATE

我试图创建一个查询,以检索vs_tblBoxes的BoxID列中的每个值出现在vs_tblRentals的BoxID列中的次数,从本质上告诉我每个盒子被租用了多少次。我可以通过以下命令执行此操作:

BOXID       MOVIEID       MEDIUMTYPECODE       DATEBOXRECEIVED

但是,我也想在不属于该组的RentalCount旁边显示信息-理想情况下,我的输出应如下所示:

SELECT COUNT(vs_tblRentals.BoxID) AS RentalCount
FROM vs_tblRentals
LEFT JOIN vs_tblBoxes B ON vs_tblRentals.BoxID = B.BoxID
GROUP BY vs_tblRentals.BoxID;

我还想在vs_tblRentals中显示已租用超过5次的Boxs的所有记录。

这在Oracle 12c中应该如何完成?

编辑:

以下代码成功获取每个BoxID的租赁计数:

BoxID    MovieID   MediumTypeCode   RentalCount 

并输出以下内容:

SELECT COUNT(vs_tblRentals.BoxID) AS RentalCount, vs_tblRentals.BoxID
FROM vs_tblRentals
LEFT JOIN vs_tblBoxes B ON vs_tblRentals.BoxID = B.BoxID
GROUP BY vs_tblRentals.BoxID;

但是我无法同时显示有关BoxID的其他信息。

从vs_tblBoxes中采样数据:

RENTALCOUNT BOXID
1           337
1           691
1           43
4           321
4           123
4           665
4           674

vs_tblRentals中的样本数据

BOXID   MOVIEID  MEDIUMTYPECODE     DATEBOXRECEIVED 
257     702      BD                 22-Nov-1953 
258     708      VHS                16-Jul-1988 
259     708      DVD                16-Jul-1988 

2 个答案:

答案 0 :(得分:0)

您可能想要以相反的顺序连接表(使vs_tblRentals中的条目为可选,而不是相反),将额外的列添加到select并GROUP BY

SELECT B.BoxID, B.MovieID, B.DateBoxReceived, COUNT(R.BoxID) AS RentalCount
FROM vs_tblBoxes B 
LEFT JOIN vs_tblRentals R
  ON R.BoxID = B.BoxID
GROUP BY B.BoxID, B.MovieID, B.DateBoxReceived;

在Oracle上使用GROUP BY(例如,与MySQL相反)要求您更全面地指定查询,并在要提取或使用聚合函数(例如{{1} }或MAX

两者都不做会导致错误。

答案 1 :(得分:0)

不是使用左联接,而是使用右外部联接。

select b.boxId, count(*) as RentalCount from 
vs_tblRentals r right outer join vs_tblBoxes b
on b.boxId = r.boxId group by b.boxId;