2011-08-11 3 views
7

고객이 상품 카탈로그를 보낼 주소 목록을 생성해야합니다. 특정 우편 번호 (Y)에 특정 수의 카탈로그 (X)를 보내려합니다. [이 우편 번호의 평균 수입과 관련이 있습니다.]SQL Server 테이블에서 각 카테고리에 대해 다른 수의 행 검색

CatalogRequestsAddressList이 테이블은 SQL Server 2008 R2에 있습니다.) =

AddressList

| Zip | QuantityRequested | 
------------------------------- 
| 12345 |   150   | 
| 13445 |   800   | 
| 45678 |   200   | 
| 41871 |   350   | 
| 77777 |   125   | 
그냥, 주소의 목록입니다

CatalogRequests

는 우리가 우리의 고객 데이터베이스에 각 우편 번호에 전송해야 얼마나 많은 카탈로그의 목록입니다

SQL 쿼리로이 작업을 시도하는 동안 잠시 머리를 숙이고 나서 C# 프로그램을 작성하여 필요한 작업을 수행했습니다 (기본적으로 SQL 쿼리를 여러 개 생성 - 각각에 대해 하나씩). CatalogRequests에 기록).

내 질문은 어떻게 하나의 SQL 쿼리로이 작업을 수행 할 수 있습니까? 저는이 시점에서 궁금 해서요. 할 수있는 방법이있는 것 같아요. 그냥 뭔가 빠졌어요. 또는 가능하지 않을 수도 있고 나는 미쳤다 =)

결과 집합은 CatalogRequest의 요구 사항을 충족하는 의 레코드입니다 (예 : 우편 번호 12345의 150 레코드, 우편 번호가 800 인 레코드). 13445 등).

DECLARE @SQL varchar(max) 

SET @SQL = 'USE Database' 

SELECT @SQL = @SQL + 'SELECT TOP ' 
      + QuantityRequired 
      + ' * FROM AddressList WHERE Zip = ' 
      + Zip 
      + ' UNION ALL' 
FROM CatalogRequests 

SET @SQL = LEFT(@SQL, (LEN(@SQL - 10))) -- remove last UNION ALL 

PRINT (@SQL) 

-- EXEC (@SQL) 

확인 동적 SQL에 대한 표준 참조에 대한 링크 :

+0

이 현상금 주셔서 감사가! –

+0

여러분, @ CodeMagician을 환영합니다! 귀하의 솔루션은 당시 나를 정말로 도와주었습니다. 게다가, 나는 [현상금 관련 모자] (http://winterbash2014.stackexchange.com/)를 원했다 ;-) – jadarnel27

답변

11

흠 ... 어떻게 이런 일에 대한 : 요청한 수량에

;with addressListWithID 
AS 
(
    SELECT name, address1, adress2, city, state, zip, 
      ROW_NUMBER() OVER(partition by zip order by newid()) as Row 
    FROM AddressList 
) 
SELECT A.name, A.address1, A.adress2, A.city, A.state, A.zip 
FROM addressListWithID A 
    INNER JOIN CatalogRequests C 
     ON C.zip = A.zip 
      AND A.row <= C.QuantityRequested 

임의의 주소.

+0

선택 목록에 표 자격을 지정하십시오. 'zip'은 모호한 필드 이름 오류를 발생시킵니다. – JNK

+0

좋은 캐치, 고마워! 검색어가 수정되었습니다. –

+1

아마도 A.row <= C.QuantityRequested'를'A.row BETWEEN 1 and C.QuantityRequested'로 바꾸는 것이 더 좋을 것입니다. 이것은 불연속 값을 필터링하는 것에 관한 것입니다. –

4

한 가지 방법은 동적 SQL (which is dangerous and not to be taken lightly)을 사용하는 것입니다.

+0

+1 아주 멋지다! 이것은 내 코드가했던 것과 유사합니다. 이것은 SQL로 할 수 있다는 것을 알면서 시간을 절약 해주었습니다. 감사! – jadarnel27

5

안된, 더 DDL없이 테스트 데이터가 없기 때문에 :

SELECT A.name , 
     A.address1 , 
     A.adress2 , 
     A.city , 
     A.[state] , 
     A.zip 
FROM CatalogRequests AS C 
     CROSS APPLY (SELECT TOP (C.QuantityRequested) 
           A.name , 
           A.address1 , 
           A.adress2 , 
           A.city , 
           A.[state] , 
           A.zip 
         FROM  addressListWithID AS A 
         WHERE  C.zip = A.zip 
        ) AS A 
+0

+1 테스트를 거쳐 작동합니다 ... 나는 이것이 'CROSS APPLY'와 (과) 가능하다는 것을 알았습니다. – James

+0

확실히 작동합니다. 답변에 감사드립니다! +1이 MagicMike의 답변보다 약간 더 읽기 쉽습니다. – jadarnel27

관련 문제