2

ロールアップ データを格納する一時テーブルがあり、データを少しクリーンアップできるかどうかを確認するクエリを作成したいと考えています。かなり簡単だと思っていましたが、実際はもっと難しいことがわかりました。多分それは簡単で、私はそれにすべて間違って近づいています。

私がやろうとしているのは、Item = 'TOTALS' であるが、名前が 2 回しか表示されない行を単純に削除することです。したがって、下の表では、行 7 と 9 を削除する必要があります。ご存知のように、鍵はありません。

名前 。アイテム ……Dlvrd
--------------------------
ボブ . 102 ........... 18
ボブ。106 .......... 32
ボブ。108 .......... 34
ボブ。999 .... 184
ボブ .. TOTALS . 702
ジョン。64 .......... 86
ジョン。合計。86
ジム .. 112 .......... 131
ジム .. 合計 .. 131
ジェーン . 10 .... 720
ジェーン。12 …………。217
ジェーン。999....... 867
ジェーン。合計 1848

私の最初の試みは、name 列のカウントを含む列を追加してから、where name != '2' and Item != 'TOTALS' のような where 句を使用することでした。それらを括弧で囲んでも機能しませんでした。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'
)
4

2 に答える 2

4

これを試して:

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 フィドルの例

于 2012-11-08T18:48:15.493 に答える
1

これは私のために働く:

select * from #TempRollup t
where 2 <> (select count(Name) from #TempRollup where Name = t.Name)
and Item <> ' TOTALS';
于 2012-11-08T19:04:45.247 に答える