2016-01-20 70 views
0

我在SQL Server中有一个存储过程,我试图只选择列中的值不止一次的记录,这可能看起来有点像一个奇怪的请求,但我似乎无法弄清楚,我曾尝试使用HAVING子句,但没有运气..SQL只在列值超过一次时才选择记录

我希望能够只选择有多个帐户在那里有不止一次,所以例如:

ACCOUNT | PAYDATE 
------------------- 
B066 | 15 
B066 | OUTSTAND 
B027 | OUTSTAND <--- **SHOULD NOT BE IN THE SELECT** 
B039 | 09 
B039 | OUTSTAND 
B052 | 09 
B052 | 15 
B052 | OUTSTAND 

BO27不应该显示在我的选择中,而其余的帐户应该。

这里是我的起点和存储过程的结束:

Select * from (

*** SELECTS ARE HERE *** 

       ) X where O_STAND <> 0.0000 
     group by X.ACCOUNT, X.ACCT_NAME , X.DAYS_CR, X.PAYDATE, X.O_STAND 
     order by X.ACCOUNT 

我一直在为此而努力了一段时间,任何帮助或建议,将不胜感激。先谢谢你。

+0

您需要返回哪些列?只是帐户?如果它有多次需要退回所有人或只是不同的帐户? –

+0

我回来了所有人,为了举例,我只在问题中显示了2列。我将要返回不止一次的所有列值。我只是不想显示记录,如果值只在那里只有一次。 –

+0

@DJONES试着计算(X.ACCOUNT)> 1'?我敢打赌:-) – krtek

回答

1

你可以用

Select *, COUNT(*) OVER (PARTITION BY ACCOUNT) cnt FROM (

替换第一个字符串,然后换你的查询作为子查询一次

SELECT cols FROM (query) q WHERE cnt>1 
+0

这是完美的,正是我所需要的,我确信其他答案的工作同样好,但这很好地诀窍。 –

+0

@DJONES可悲的是,现在的用户只是在寻找“做工作”的东西,但没有学到任何东西,或者试图使它变得简单和美观。 '具有'条件的'group by'将会更快并且更易于阅读。 – krtek

+0

@krtek我尝试使用HAVING COUNT(X.ACCOUNT)> 1日前,但没有工作,我希望的方式它,使用梅德的数列可以让我每类型账户的数量手柄在我的报告中,我也可以使用它来进行进一步的实现,你说得对,但我不在那个类别:) –

0

是的,having条款是解决正是这种任务的。基本上,它就像where,但不仅允许按列值进行过滤,还允许按集合函数的结果进行过滤:

declare @t table (
    Id int identity(1,1) primary key, 
    AccountId varchar(20) 
); 

insert into @t (AccountId) 
values 
    ('B001'), 
    ('B002'), 
    ('B015'), 
    ('B015'), 
    ('B002'); 

-- Get all rows for which AccountId value is encountered more than once in the table 
select * 
from @t t 
where exists (
    select 0 
    from @t h 
    where h.AccountId = t.AccountId 
    group by h.AccountId 
    having count(h.AccountId) > 1 
);