2012-11-08 54 views
1

我有一個存儲彙總數據的臨時表,並且希望創建一個查詢以查看我是否可以稍微清理一些數據。我認爲這會很容易,但事實證明,這會變得更加困難。也許這很容易,我只是接近它而已。篩選出在子查詢中返回的行

我想要做的只是刪除行,其中Item ='TOTALS'但名稱只顯示兩次。所以在下面的表格中,第7行和第9行應該被刪除。只是你知道,沒有鑰匙。

名稱。 Item ...... Dlvrd
--------------------------
Bob。 102 .......... 18
Bob。 106 .......... 32
Bob。 108 .......... 34
Bob。 999 .......... 184
Bob .. TOTALS。 702
約翰。 64 ........... 86
John。總計。 86
Jim .. 112 .......... 131
Jim .. TOTALS .. 131
簡。 10 .......... 720
簡。 12 ........。 217
簡。 999 ........ 867
簡。總計1848

我的第一次嘗試包括添加一個名稱列的計數列,然後使用where子句,如:where name!='2'和Item!='TOTALS'。沒有工作,甚至括括號括起來。它只是刪除任何一行2或其中Item ='TOTALS'的行。它完全忽略了'AND'。在這裏我的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

Don,起初我以爲你的解決方案有效,但它實際上刪除了太多的行。由於小數據集沒有看到它。 – N1tr0