2011-03-28 64 views
1

我想寫一個客戶端的排名匹配/搜索系統,將查看所需材料(MaterialRequest表)並找到提供者(其中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 

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) 

這些材料

material_req_id request_id material_id 
1     1   10 (steel) 
2     1   11 (copper) 
3     1   12 (titanium) 
4     1   13 (nickel) 

和MaterialProvider被填充像

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) 

我希望我的輸出看起來像

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

其中列名是從該請求的材料的。然後能夠找到能夠提供超過給定材料比例的供應商。

,我已經開始與臨時表和光標

  1. 列添加到臨時表
  2. 然後通過3000+供應商迭代,並添加這些供應商能夠提供的指定教材。

有沒有更好的方法來做到這一點?這個過程需要太長的時間,希望能夠在如何寫這樣的東西方面取得更好的成果/最佳實踐。

+0

Y/N代表您的預期產出? – Jody 2011-03-28 15:09:24

+0

是/否指示供應商是否可以提供該欄所代表的材料。 – 2011-03-28 18:49:37

回答

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

在確定了一組目標提供商後,對材料名稱的最後數據進行修正。先做所有的數學,然後再做相當的格式化。