2016-01-20 59 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 
);