2011-03-28 6 views
1

요청한 자료 (MaterialRequest 테이블)를보고 (userRequest 테이블의 userprofile.usertype_id = 1 인) 공급자를 찾은 클라이언트에 대해 순위 매치/검색 시스템을 작성하려고합니다.) 누가 자료를 제공하고 자료의 대부분 또는 전부를 제공 할 수있는 결과의 순위를 매기 는가.동적 열과 일치하는 일치 및 순위 쿼리

USERPROFILE 표

userprofile_id int identity 
userprofile_dt datetime 
first_nm   varchar(50) 
last_nm   varchar(50) 
usertype_id  int (provider = 1, requestor = 2) 

요청 표

request_id  int identity 
request_dt  datetime 
title   varchar(50) 
description  varchar(100) 
userprofile_id int (where usertype = 2) 

MaterialRequest 표

material_req_id int identity 
request_id  int 
material_id  int 
,691,363 : 여기가 데이터베이스 스키마입니다 (210)

MaterialProvider 표

material_pro_id int identity 
userprofile_id int (where usertype = 1) 
material_id  int 

자료 표

material_id  int identity 
material_desc varchar(50) 

따라서, 예를 들어,이 요청이있는 경우 :

request_id = 1 
request_dt = 3/28/2011 
title = 'test request' 
desc = null 
userprofile_id = 100 (where usertype_id = 2) 

하고 이러한 자료를 요청했다을

3,647,976,589,과 MaterialProvider 내가 내 출력 열 이름이 요청의 재료에서 파생 된

userprofile_id steel copper nickel titanium pct_match 
2     Y  Y   Y   N   75 
3     N  Y   Y   Y   75 

같이 기대

material_pro_id userprofile_id material_id 
1     2    10 (steel) 
2     2    11 (copper) 
3     2    13 (nickel) 
4     3    11 (copper) 
5     3    13 (nickel) 
6     3    12 (titanium) 

처럼 채워졌다. 그런 다음 요청 된 자료의 일정 비율 이상을 제공 할 수있는 제공 업체를 찾을 수 있습니다.

나는

  • 이 후 3000 개 공급자를 통해 반복하고 지정된 자료를 제공 할 수있는 그 공급자를 추가 임시 테이블에 열을 추가

    1. 에 임시 테이블 및 커서와 함께 시작했다.

    더 좋은 방법이 있나요? 프로세스가 너무 오래 걸리고 이런 식으로 작성하는 방법에 대한 더 나은/모범 사례를 얻고 싶습니다.

  • +0

    예상 출력에서 ​​Y/N은 무엇을 나타 냅니까? – Jody

    +0

    Y/N은 공급 업체가 해당 열이 나타내는 재료를 제공 할 수 있는지 여부를 나타냅니다. –

    답변

    1
    ;WITH NormalOutput AS (
        /* normal output: one material per row */ 
        SELECT 
        p.userprofile_id, 
        m.material_desc, 
        value = CASE WHEN mp.material_pro_id IS NULL THEN 'N' ELSE 'Y' END 
        FROM Request r 
        INNER JOIN MaterialRequest mr ON r.request_id = mr.request_id 
        INNER JOIN Material m ON mr.material_id = m.material_id 
        CROSS JOIN (SELECT DISTINCT userprofile_id FROM MaterialProvider) p 
        LEFT JOIN MaterialProvider mp 
         ON p.userprofile_id = mp.userprofile_id AND mr.material_id = mp.material_id 
        WHERE r.request_id = 1 
    ) 
    SELECT p.*, t.pct_match 
    FROM (
        /* pivoting the normal output */ 
        SELECT userprofile_id, steel, copper, titanium, nickel 
        FROM NormalOutput n 
        PIVOT (MAX(value) FOR material_desc IN (steel, copper, titanium, nickel)) p 
    ) p 
    
    INNER JOIN (
        /* aggregating the normal output (calculating percents) */ 
        SELECT 
        userprofile_id, 
        pct_match = COUNT(CASE value WHEN 'Y' THEN value END) * 100/COUNT(*) 
        FROM NormalOutput 
        GROUP BY userprofile_id 
    ) t 
    
    /* joining the two modified outputs */ 
    ON t.userprofile_id = p.userprofile_id 
    
    0

    대상 공급자 세트를 식별 한 후에 재료 이름에 피벗을 수행하십시오. 먼저 모든 수학을 수행 한 다음 예쁜 포맷을 수행하십시오.

    관련 문제