2011-11-22 2 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 (번호)을 획득 한 후 순서대로 번호를 모두와 함께 테이블 변수를 채우는 것입니다 할 수있는 가장 좋은 방법을 생각했다. 테이블 변수에서 위젯 번호가 Product 테이블에 없으면 번호를 반환하고 누락 된 것으로 표시합니다.

그러나; 우리의 DBA는 커서에 대해 대단히 많이 작용하며 WHILE 루프는 오버 헤드가 많이 발생한다는 것을 알고 있습니다. 또한 상점별로이 작업을 수행하는 방법을 잘 모르겠습니다.

누구나 세트 기반 방식으로이 작업을 수행하는 방법을 알고 있습니까?

위젯 자체에는 숫자가 있으므로 위젯 # 1을 판매 할 때 다음에 판매하는 위젯은 위젯 # 2 여야합니다. 하나; 때로는 그런 일이 일어나지 않고 위젯 # 3이 판매됩니다 - 위젯 # 2가 누락되어 데이터베이스에 없습니다. 위젯 # 1과 # 3이 판매되었고 # 2가 누락되었다는 사실을 보고서에서 확인해야합니다.

+3

집합 기반 솔루션을 사용할 수없는 DBA가 있습니까? DBA를 해고하십시오! – JonH

+0

나는 지난 주 DBA가 질문에 대답하기에 너무 바쁘다고하고, 자신의 도움없이이 보고서를 개발하기 위해 자신의 SQL 지식을 구축해야한다고 들었다. (BTW, DBA가 아니라 내 상사가) – DataGirl

답변

1

업데이트 대답

샘플 코드는 테이블과 작업 솔루션은 다음과 같습니다 만들 수 있습니다. 기본적으로 2 EXISTS 검사 - 현재 숫자보다 높은 숫자가 있는지 확인하고 현재 숫자보다 하나 더 높은 숫자가 없는지 확인합니다.

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. 해결책을 게시하려면 잠시만 기다려주세요. – JNK

+0

@DataGirl - 작업 솔루션 게시. – JNK

0

숫자 표를 만들고 필요한 것보다 많은 숫자로 채우십시오. 그런 다음 집합 기반 쿼리를 사용하여 결과를 얻을 수 있습니다.

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 
관련 문제