SQL Server 2008 Объединить или проверить строки на основе значения

65
6

У меня есть таблица, которая выглядит примерно так:

+------------+---------+--------+---------+--------+--------+
| 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. Надеюсь, это имеет смысл.

спросил(а) 2020-03-19T21:39:41+03:00 1 год, 7 месяцев назад
1
Решение
65

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

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

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

ответил(а) 2020-03-19T21:54:21.422065+03:00 1 год, 7 месяцев назад
46

Попробуйте этот 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)

ответил(а) 2020-03-19T21:39:41+03:00 1 год, 7 месяцев назад
46

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

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 здесь, чтобы отметить ошибку, но вы можете оставить ее, чтобы получить нулевое значение, когда у вас есть проблема.

ответил(а) 2020-03-19T21:39:41+03:00 1 год, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема