2011-11-22 7 views
1

番号が連続する不足している製品を特定する必要があります。言い換えれば、それぞれの店舗に固有の番号が付いた一連の商品が販売されています。エンドユーザは、日付範囲内に欠落しているウィジェットを特定するレポートを必要とします。SQL Server 2008 R2でカーソルを使用せずにテーブルにデータを挿入する方法

Store Product Number 
Store 1 Widget 100 
Store 1 Widget 101 
Store 1 Widget 102 
Store 1 Widget 104 
Store 2 Widget 201 
Store 2 Widget 202 
Store 2 Widget 203 

私はこれを行うための最善の方法は、MAX(番号)とMIN(番号)を取得してから順番に番号のすべてとテーブル変数を移入することであると思いました。テーブル変数のウィジェット番号が商品テーブルに存在しない場合は、その番号を返し、行方不明とマークします。

ただし、私たちのDBAはカーソルに非常によく似ています。私はWHILEループが多くのオーバーヘッドを取ることを知っています。さらに、ストアベースでこれを行う方法がわかりません。

これを行う方法は誰でも知っていますか?

ウィジェット自体に番号があるので、ウィジェット#1を販売するときは、次に販売するウィジェットはウィジェット#2にする必要があります。しかしながら;ウィジェット#3が販売されている - ウィジェット#2が欠落していて、データベースにない場合があります。ウィジェット#1と#3が販売され、#2が販売されていないことをレポートで特定する必要があります。

+3

を取得するために、セットベースのクエリを使用することができますか? DBAを撃ってください! – JonH

+0

私は先週、私たちのDBAが質問に答えるには忙しいと言いました。私は自分のSQLの知識に基づいて、自分の助けなしにこれらのレポートを開発する必要があります。 (BTW、DBAではなく、私の上司によって) – DataGirl

答えて

1

回答

サンプルテーブルを作成するためのコードと、作業溶液を更新は以下の通りです。基本的には2 EXISTSのチェック - 現在の番号よりも高い番号があり、現在の番号よりも1番目の番号がないことを確認します。

DECLARE @t Table (Store int, Product varchar(100), number int) 
INSERT INTO @t 
VALUES 
(1, 'Widget', 100), 
(1, 'Widget', 101), 
(1, 'Widget', 102), 
(1, 'Widget', 104), 
(2, 'Widget', 201), 
(2, 'Widget', 202), 
(2, 'Widget', 203) 

SELECT Store, Product, t.Number+1 as Missing 
FROM @t t 
WHERE EXISTS (SELECT 1 FROM @t t2 
       WHERE t2.Store = t.Store 
       AND t2.product = t.product 
       AND t2.number > t.number) 
AND Not Exists (SELECT 1 FROM @t t3 
       WHERE t3.Store = t.store 
       AND t3.product = t.product 
       AND t3.number = t.number + 1) 
+0

私は十分に私の問題を説明していないと思う。ウィジェット自体に数字があるので、ウィジェット#1を販売するときは、次に販売するウィジェットはウィジェット#2にする必要があります。しかしながら;ウィジェット#3が販売されている - ウィジェット#2が欠落していて、データベースにない場合があります。 – DataGirl

+0

@DataGirl - 確認しやすいAHHHHHHHHHH。解決策を投稿するために私に1分を与えてください。 – JNK

+0

@DataGirl - 作業ソリューションが掲載されました。 – JNK

0

数値表を作成し、必要以上の数値を入力します。 そして、あなたはあなたがセットベースのソリューションを助けることができないDBAを持っている結果

Create table #temp (product varchar(15), id int) 
insert into #temp 
values ('test', 1), ('test', 3),('test', 4),('test2', 6),('test2', 2),('test2', 10),('test3', 10),('test3', 9),('test3',7),('test4', 1),('test4', 2),('test4', 3) 

create table #product (product varchar (15)) 
insert into #product 
values ('test'),('test2'),('test3'),('test4'), ('test5') 
create table #num (number int) 

insert into #num 
values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15) 

select n.number,p.product from #num n 
cross join #product p 
left join (
select product, max(id)as maxid from #temp group by product)a 
on a.product = p.product 
left join #temp t on n.number = t.id and t.product = p.product 
where n.number <=a.maxid and t.id is null 
order by p.product 
関連する問題