2013-09-29 3 views
0

У меня есть таблица (упрощенный ниже)SQL-группы путем подсчета с

|company|name |age| 
| 1  | a | 3 | 
| 1  | a | 3 | 
| 1  | a | 2 | 
| 2  | b | 8 | 
| 3  | c | 1 | 
| 3  | c | 1 | 

По разным причинам столбец возраст должен быть одинаковым для каждой компании. У меня есть еще один процесс, который обновляет эту таблицу, и иногда она вводит неверный возраст. Для компании 1 возраст должен всегда быть 3

Я хочу узнать, какие компании имеют несоответствие возраста.

Ive сделали это

select company, name age from table group by company, name, age 

, но не знаете, как получить строки, в которых возраст отличается. эта таблица намного шире и имеет множество столбцов, поэтому я не могу ее отличить.

Может ли кто-нибудь помочь?

Благодаря

+0

Что такое правило, что приводит к фир- = 1' иметь 'возраст = 1'? Как вы находите несоответствие? –

+0

Примечание: это также можно решить с помощью самоподключения. – user2246674

+0

@ user2246674 Зачем вам нужно присоединиться? –

ответ

3

Вы не должны быть в том числе age в группе по п.

SELECT company 
FROM tableName 
GROUP BY company, name 
HAVING COUNT(DISTINCT age) <> 1 
+0

Я думаю, что можно группировать только компанию, там не нужно имя –

+0

@RomanPekar IMO, это должно иметь «имя» в группе по статье, поскольку у компании может быть много сотрудников. * btw, это только предположение * –

+0

[Другой пример здесь.] (http://sqlfiddle.com/#!2/860b2/1) –

0

Поскольку вы упомянули "как получить строки где возраст отличается", а не только comapnies:

Добавить уникальный идентификатор строки (а первичный ключ), если его еще нет. Назовем это id.

Затем сделать

select id from table 
where company in 
    (select company from table 
    group by company 
    having count(distinct age)>1) 
0

Если вы хотите, чтобы найти строку (ы) с разным возрастом, чем максимальная подсчета возраст каждой группы компании/именем:

WITH CTE AS 
(
    select company, name, age, 
      maxAge=(select top 1 age 
      from dbo.table1 t2 
      group by company,name, age 
      having(t1.company=t2.company and t1.name=t2.name) 
      order by count(*) desc) 
    from dbo.table1 t1 
) 
select * from cte 
where age <> maxAge 

Demontration

Если вы хотите скорректировать неправильный возраст, вам просто нужно заменить SELECT на UPDATE:

WITH CTE AS 
(
    select company, name, age, 
      maxAge=(select top 1 age 
      from dbo.table1 t2 
      group by company,name, age 
      having(t1.company=t2.company and t1.name=t2.name) 
      order by count(*) desc) 
    from dbo.table1 t1 
) 
UPDATE cte SET AGE = maxAge 
WHERE age <> maxAge 

Demonstration

Смежные вопросы