2013-03-26 91 views
0

我正在使用T-SQL中的數據庫,現在我有一個問題。如果然後在T-SQL

我有相同的名稱,但在列的一個不同的值多行(在一行doc是0,第二行doc中是2000年),和一些行來了一次,並且只有一個值。

現在,我想選擇所有行中我有0的那些,如果沒有0,那麼我想選擇具有該值的那個。

這裏的樣本數據:

CREATE TABLE Table1 
    ([name] varchar(3), [doc] int, [sum] int) 
; 

INSERT INTO Table1 
    ([name], [doc], [sum]) 
VALUES 
    ('tom', 0, 100), 
    ('tom', 2000, 200), 
    ('jon', 2000, 200) 
; 

現在我希望得到其中TOM具有值爲100的行,喬恩的200

+3

而不是談論我行會顯示樣本數據和期望的結果。 – 2013-03-26 21:57:44

+2

你到目前爲止嘗試過什麼?另外,谷歌的第一個結果是「tsql if then」http://msdn.microsoft.com/en-us/library/ms182587.aspx – 2013-03-26 21:58:41

+0

OK,DB有 name,doc,sum; tom,0,100; tom,2000,200; jon,2000,200; 現在我希望得到TOM值爲100的行,JON的值爲200. 我的數據庫有大約500000行,這就是爲什麼我沒有給出任何確切的東西。 Sry – tljubas 2013-03-26 22:01:07

回答

0

假設你A列不能有負值的價值:

select name, min(A) 
from yourtable 
group by name 

如果你想整行的每一個上面,那麼你必須使用子查詢:

select yourtable.* from yourtable 
join (
    select name, min(A) [mina] 
    from yourtable 
    group by name 
) a on a.name=yourtable.name and a.[mina]=yourtable.A 
0

該版本使用窗口函數來計算每個名稱的零值的行數。然後使用問題中的邏輯選擇值爲0的行或具有有效值的行。

select name, value 
from (select name, value, 
      sum(case when value = 0 then 1 else 0 end) over (partition by name) as NumZeros 
     from t 
    ) t 
where numZeros = 0 or value = 0 
3

的一種方式,在CTE使用ROW_NUMBER

WITH cte 
    AS (SELECT [name], 
       [doc], 
       [sum], 
       [rn] = Row_number() 
         OVER( 
         partition BY name 
         ORDER BY CASE WHEN doc=0 THEN 0 ELSE 1 END) 
     FROM table1) 
SELECT [name], 
     [doc], 
     [sum] 
FROM cte 
WHERE rn = 1 

DEMO(與你的樣本數據)