2016-07-11 5 views
1

У меня есть таблица, которая выглядит примерно так:SQL Server 2008 Объединить или тестовые строки на основе значения

+------------+---------+--------+---------+--------+--------+ 
| emplname | JAN | FEB | MAR | APR | MAY | 
+------------+---------+--------+---------+--------+--------+ 
| ALLEN | NULL | NULL | 17 | 17 | 17 | 
| ALLEN | 17 | 17 | 205 | NULL | NULL | 
| ADAMS | NULL | NULL | 14 | 14 | 17 | 
| BROWN | NULL | 205 | 13 | 13 | 13 | 
| BROWN | 12 | 12 | NULL | NULL | NULL | 
+------------+---------+--------+---------+--------+--------+ 

Я хочу, чтобы объединить строки, где emplname одинаковы и пренебрегая 205 значений, поэтому для ALLEN , я хотел бы получить

| ALLEN | 17 | 17 | 17 | 17 | 17 | 

для BROWN было бы

| BROWN | 12 | 12 | 13 | 13 | 13 | 

в основном то, что я хочу сделать, это быть в состоянии найти, если на одного работника, если столбец имеет две записи для него, за исключением, если это запись плюс 205, я могу игнорировать 205. То, что я хочу, чтобы найти что-то вроде этого:

| BROWN | NULL | 13 | 13 | 13 | 13 | 
| BROWN | 12 | 12 | NULL | NULL | NULL | 

где что третий столбец имеет 13 и 12 для этого одного сотрудника. Я ищу такие вещи. если он существует, верните emplname. Надеюсь, это имеет смысл.

+0

вы хотите результат вас в курсе или emplname? – JamieD77

+0

Если честно, то в любом случае. Вероятно, лучше всего просто получить emplname, отвечающее этим критериям. Таким образом, BROWN будет возвращен, остальные не будут – dk96m

ответ

1

Вы могли бы попробовать это (я думаю, что я понять вас правильно, это будет выводить имена сотрудников, которые нуждаются в два ряда)

SELECT emplname FROM yourtable 
GROUP BY emplname 
HAVING COUNT(CASE WHEN JAN = 205 THEN NULL ELSE JAN END) > 1 OR 
COUNT(CASE WHEN FEB = 205 THEN NULL ELSE FEB END) > 1 OR 
COUNT(CASE WHEN MAR = 205 THEN NULL ELSE MAR END) > 1 OR 
COUNT(CASE WHEN APR = 205 THEN NULL ELSE APR END) > 1 OR 
COUNT(CASE WHEN MAY = 205 THEN NULL ELSE MAY END) > 1 

Позвольте мне знать, если это было то, что вы имеете в виду; Я думаю, что он отвечает на вторую часть вопроса.

+0

Вы можете заменить 'CASE WHEN JAN = 205 THEN NULL ELSE JAN END' с' NULLIF (JAN, 205) 'за каждый месяц - oops, я вижу, что это было упомянуто снова в другом ответе –

0

Присоединяйтесь таблицу к себе, а затем использовать следующее утверждение

COALESCE(CASE WHEN table1.fieldname = 205 THEN NULL ELSE table1.fieldname END, 
     CASE WHEN table2.fieldname = 205 THEN NULL ELSE table2.fieldname END,0) 

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

+0

вы можете использовать 'NULLIF (имя поля, 205)' вместо 'CASE WHEN fieldname = 205 THEN NULL ELSE fieldname END' – Lamak

+0

@Lamak, я мог бы, но я решил использовать стандартный SQL, который будут иметь одинаковую производительность. – Hogan

0

Попробуйте SQL:

SELECT T.emplname 
    , ISNULL(T.JAN,IIF(T205.JAN=205,NULL,T205.JAN)) 
    , ISNULL(T.FEB,IIF(T205.FEB=205,NULL,T205.FEB)) 
    , ISNULL(T.MAR,IIF(T205.MAR=205,NULL,T205.MAR)) 
    , ISNULL(T.APR,IIF(T205.APR=205,NULL,T205.APR)) 
    , ISNULL(T.MAY,IIF(T205.MAY=205,NULL,T205.MAY)) 
FROM myTable as T left join myTable as T205 on T.emplname = T205.emplname 
    AND (T.JAN <> 205 AND T.FEB <> 205 AND T.MAR <> 205 
      AND T.APR <> 205 AND T.MAY <> 205) 
    AND (T205.JAN = 205 OR T205.FEB = 205 OR T205.MAR = 205 
      OR T205.APR = 205 OR T205.MAY = 205) 
Смежные вопросы