2016-02-21 6 views
0

У меня есть таблица со столбцами ID и Val. Для каждого значения ID мы можем иметь одинаковые или разные значения Val.Различные значения столбца 1 на основе столбца 2 SQL Server

ID Val 
1 A 
1 NULL 
2 00 
2 00 
2 00 
2 00 
3 00 
3 A 
4 A 
5 00 
5 00 
5 A 
6 A 
6 A 
6 NULL 
6 00 

Из таблицы выше, я ищу идентификаторы, которые имеют разные значения в столбце Val. Если для любого заданного ID все значения столбца Val совпадают, то он не должен входить в результат.

Таким образом, результат будет примерно таким.

D Val 
1 A 
1 NULL 
3 00 
3 A 
5 00 
5 00 
5 A 
6 A 
6 A 
6 NULL 
6 00 

Id 2 не должен входить в результат, потому что для Id 2 столбец Val имеет одинаковые данные. Аналогично, ID 4 не будет получен, поскольку ID 4 имеет только одну строку.

Для каждого идентификатора, если у нас есть более одного значения в столбце Val, это должно показать результат.

Спасибо за помощь!

ответ

0

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

SELECT ID, Val 
FROM mytable 
WHERE ID IN (SELECT ID 
      FROM mytable 
      GROUP BY ID 
      HAVING COUNT(DISTINCT CASE 
            WHEN Val IS NULL THEN '' 
            ELSE Val 
            END) > 1 

Я сделал предположение, что Val поле имеет тип VARCHAR и что это может быть либо NULL или <> ''.

+0

Как я могу получить только те ID, которые имеют по крайней мере один «00» в Val? – Loyyds

+0

@Raveesh Это другой вопрос! Попробуйте написать другой пост. –

1

Для идентификаторами, которые удовлетворяют условию, имеющих различные значения:

select id 
from t 
group by id 
having min(id) <> max(id); 

Вы можете включить это в запрос как:

select t.* 
from t join 
    (select id 
     from t 
     group by id 
     having min(id) <> max(id) 
    ) tt 
    on t.id = tt.id; 

Или, вы можете использовать окно функции:

select t.id, t.val 
from (select t.*, 
      min(val) over (partition by id) as minval, 
      max(val) over (partition by id) as maxval 
     from t 
    ) t 
where minval <> maxval; 
0

Создайте ваш запрос в три этапа:

  1. Выберите различающиеся значения идентификатора, Вэлы (чтобы убедиться, что вы получите нулевое безопасное количество)
  2. Count различных значений для каждого идентификатора
  3. Показать результаты из исходной таблицы

Попробуйте использовать внутренний выбор вместо подзапроса, чтобы ускорить запрос.

Решение записывается в поле ниже запроса:

SELECT 
    t.* 
FROM 
    -- select only ids with distinct count > 1 
    (
     SELECT 
      id 
     FROM 
      -- select distinct values to ensure your count of null values is real 
      (
       SELECT DISTINCT 
        id, val 
       FROM 
        t 
      ) AS td 
     GROUP BY 
      id 
     HAVING 
      COUNT(*) > 1 
    ) AS tc 
-- join the source table 
INNER JOIN 
    t 
ON 
    t.id = tc.id 
Смежные вопросы