2013-04-23 64 views
0

我有插入它下面的列和值创造了这个简单的库结算表计数:SQLPLUS选择一列,并在同一SELECT语句中

insert into CHECKOUT (MemID, Cat#, DateChkOut, DateDue, DateRet) 
    values (4, 'T 430.98 1956', '15-Mar-2011', '14-Jun-2011', '31-May-2011'); 
insert into CHECKOUT (MemID, Cat#, DateChkOut, DateDue, DateRet) 
    values (12, 'B 125.2 2013', '15-Mar-2011', '14-Jun-2011', NULL); 
insert into CHECKOUT (MemID, Cat#, DateChkOut, DateDue, DateRet) 
    values (4, 'T 430.98 1956', '27-Dec-2012', '25-Mar-2013', NULL); 

对于每个成员,我需要列出的会员ID和有多少书被检出。我试过使用:

select distinct MemID, count(distinct Cat#) from CHECKOUT; 

但收到错误:不是单组功能。显然我不能选择一个列和一个计数来同时显示,但我可能是错的。有任何想法吗?

+0

戈登给你一个正确的答案。你不知道的部分非常重要。既然如此,我已经听说过这本书的好处,在10分钟内教你自己的SQL。 – 2013-04-23 16:04:55

回答

2

你需要一个group by声明,而不是一个select distinct

select MemID, count(distinct Cat#) 
from CHECKOUT 
group by MemId 

如果你想成员谁没有签出一本书,那么你需要一个left outer join

select memID, count(distinct Cat#) 
from Members m left outer join 
    Checkout co 
group by m.MemId 

left outer join背后的想法是保留第一个表中的所有行以及第二个表中的匹配。这使您可以查找没有匹配行的成员。

好像你正在学习SQL。你应该做一些学习,以更好地理解语言。

+0

非常感谢Gordon的帮助!我还需要列出那些从未签出过书籍的成员姓名(他们的ID和姓名存储在名为Member的单独表中,ID是结帐MemID的PK)。功能是否也是功能组的一部分,或者是否有一个不同的功能可用于解决这个问题? – Rekson 2013-04-23 16:34:27

相关问题