2013-03-26 1 views
0

Я работаю над БД в T-SQL, и теперь у меня есть проблема.ЕСЛИ В Т-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, а JON имеет значение 200.

+3

Вместо того, чтобы говорить о строках я бы показывают данные выборки и желаемого результата. –

+2

Что вы пробовали? Кроме того, первый результат из Google «tsql if then» http://msdn.microsoft.com/en-us/library/ms182587.aspx –

+0

ОК, у БД есть имя, документ, сумма; том, 0, 100; том, 2000, 200; jon, 2000, 200; и теперь я ожидаю получить строку, где TOM имеет значение 100, а JON имеет значение 200. У моей базы данных есть около 500 000 строк, поэтому я ничего точно не дал. Sry – tljubas

ответ

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

Один из способов, с помощью ROW_NUMBER в CTE:

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 (с образцами данных)