2012-11-08 2 views
1

У меня есть временная таблица, в которой хранятся данные свертки, и хотелось бы создать запрос, чтобы узнать, могу ли я немного очистить данные. Я думал, что это будет довольно легко, но оказалось, что это намного сложнее. Может быть, это легко, и я просто приближаюсь ко всему этому.Отфильтровать строки, возвращенные в подзапросе

То, что я пытаюсь сделать, это просто удалить строки, где Item = 'TOTALS', но где имя отображается только дважды. Поэтому в таблице ниже строки 7 и 9 должны быть удалены. Просто, чтобы вы знали, ключей нет.

Наименование. Пункт ...... Dlvrd
--------------------------
Bob. 102 .......... 18
Боб. 106 .......... 32
Боб. 108 .......... 34
Боб. 999 .......... 184
Bob .. TOTALS. 702
John. 64 ........... 86
John. ВСЕГО. 86
Jim .. 112 .......... 131
Jim .. TOTALS .. 131
Jane. 10 .......... 720
Jane. 12 ......... 217
Джейн. 999 ........ 867
Jane. СОСТАВИЛ 1848

Моя первая попытка состояла добавления столбца с графом столбца имя, а затем, используя, где положение, как: где имя = «2» и пункт = «TOTALS»!. Не работает, даже помещая вокруг них круглые скобки. Он просто удаляет любую строку с 2 или где Item = 'TOTALS'. Это полностью игнорирует «И». Вот моя SQL:

select t.count, tr.* 
From #TempRollup tr 
join (
    select 
     Name 
    , COUNT(Name) count 
    from #TempRollup 
    Group by Name 
    ) as t on t.Name = tr.Name 
where (
t.count != 2 
and Item != 'TOTALS' 
) 

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

Select * 
FROM #TempRollup 
WHERE NOT EXISTS( 
    select tr.* 
    From #TempRollup tr 
    join (
      select 
       Name 
      , COUNT(Name) count 
      from #TempRollup 
      Group by Name 
      ) as t on t.Name = tr.Name 
    where t.count = 2 
    and Item = 'TOTALS' 
) 

ответ

3

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

SELECT t.* 
FROM #TempRollup t 
INNER JOIN 
(
    SELECT Name, COUNT(*) cnt 
    FROM #TempRollup 
    GROUP BY Name 
) counts ON t.Name = counts.Name 
WHERE t.Item <> 'TOTALS' OR counts.cnt <> 2 

SQL Fiddle example

+0

Спасибо Lc.! Это был быстрый ответ и возвращает именно то, что мне нужно. Теперь я планирую выяснить, почему моя работа не работает. :-) – N1tr0

+0

Причина, по которой она не работает, связана с тем, что вы не сопоставляли свой основной запрос с подзапросом NOT EXISTS. Поскольку одна строка, удовлетворяющая вашему запросу, существовала * где-то в таблице *, EXISTS вернула True для каждой строки. –

+0

А, ок. Спасибо за объяснение. – N1tr0

1

Это работает для меня:

select * from #TempRollup t 
where 2 <> (select count(Name) from #TempRollup where Name = t.Name) 
and Item <> ' TOTALS'; 
+0

Дон, сначала я думал, что ваше решение работает, но на самом деле удаляет слишком много строк. не видел его из-за небольшого набора данных. – N1tr0

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