2010-03-03 62 views
1

我有以下問題。我有幾十萬條記錄的表,它具有以下標識符(爲簡單起見)SQL Server 2008:生成唯一條目表

MemberID  SchemeName  BenefitID  BenefitAmount 
10   ABC    1    10000 
10   ABC    1    2000 
10   ABC    2    5000 
10   A.B.C    3    11000 

我需要做的是將其轉換成看起來像這樣一個記錄:

MemberID  SchemeName  B1  B2  B3   
10   ABC    12000 5000 11000  

當然,我需要通過SchemeName來區分這個問題,對於大多數記錄來說,這不會是一個問題,但是對於某些SchemeName將無法正確捕獲。現在,我不特別在意轉換後的表是否使用「ABC」或「A.B.C」作爲方案名稱,只要它只使用其中的1個即可。

我很樂意聽取您的建議。

感謝
卡爾

(使用SQL Server 2008)

+0

可能有多少個BenefitID值?每個MemberID和SchemeName都一樣嗎? – 2010-03-03 14:08:01

+1

@Karl根據您的意見,您似乎有兩個問題:將行組合成列,以及如何根據不同的文本字段組合行。更難的是基於不同文本的組合行,所以爲什麼不詳細說明。給出一些很好的例子,說明你正在處理什麼以及哪些是可以接受的,因爲任何算法都不會100%準確。如果你有一個算法來匹配這些,即使它只是一個想法(不是代碼)給它。否則在你的問題上沒有太多的信息可以繼續,你也不可能得到更多的幫助。 – 2010-03-03 14:47:02

回答

2

基於原來的問題的有限信息,試試這個:

DECLARE @YourTable table(MemberID int, SchemeName varchar(10), BenefitID int, BenefitAmount int) 

INSERT INTO @YourTable VALUES (10,'ABC' ,1,10000) 
INSERT INTO @YourTable VALUES (10,'ABC' ,1,2000) 
INSERT INTO @YourTable VALUES (10,'ABC' ,2,5000) 
INSERT INTO @YourTable VALUES (10,'A.B.C',3,11000) 
INSERT INTO @YourTable VALUES (11,'ABC' ,1,10000) 
INSERT INTO @YourTable VALUES (11,'ABC' ,1,2000) 
INSERT INTO @YourTable VALUES (11,'ABC' ,2,5000) 
INSERT INTO @YourTable VALUES (11,'A.B.C',3,11000) 
INSERT INTO @YourTable VALUES (10,'mnp',3,11000) 
INSERT INTO @YourTable VALUES (11,'mnp' ,1,10000) 
INSERT INTO @YourTable VALUES (11,'mnp' ,1,2000) 
INSERT INTO @YourTable VALUES (11,'mnp' ,2,5000) 
INSERT INTO @YourTable VALUES (11,'mnp',3,11000) 

SELECT 
    MemberID, REPLACE(SchemeName,'.','') AS SchemeName 
     ,SUM(CASE WHEN BenefitID=1 THEN BenefitAmount ELSE 0 END) AS B1 
     ,SUM(CASE WHEN BenefitID=2 THEN BenefitAmount ELSE 0 END) AS B2 
     ,SUM(CASE WHEN BenefitID=3 THEN BenefitAmount ELSE 0 END) AS B3 
    FROM @YourTable 
    GROUP BY MemberID, REPLACE(SchemeName,'.','') 
    ORDER BY MemberID, REPLACE(SchemeName,'.','') 

輸出:

MemberID SchemeName B1   B2   B3 
----------- ----------- ----------- ----------- ----------- 
10   ABC   12000  5000  11000 
10   mnp   0   0   11000 
11   ABC   12000  5000  11000 
11   mnp   12000  5000  11000 

(4 row(s) affected) 
+0

好的,如果我只需要刪除標點符號,這將解決問題。但那只是一個任意的例子。如果我有「美國廣播公司」和「美國廣播公司的計劃咩」等等,那麼該怎麼辦? – Karl 2010-03-03 14:17:22

+1

@卡爾,如果你有這樣大不相同的SchemeNames,你運氣不好,你需要手動清理數據。我只是猜測,但可能需要更改應用程序,以向用戶顯示一個有效值的選擇框以從中選擇,而不是自由文本以輸入他們想要的內容。 – 2010-03-03 14:37:47

+0

你必須選擇一個。例如,用'MIN(SchemeName)'替換'REPLACE(SchemeName,'。','')'。 – 2010-03-03 14:37:58

0

它看起來是PIVOTS可以幫助

+0

樞軸將工作得很好,但我仍然需要處理SchemeName問題 – Karl 2010-03-03 14:18:19

0

該schemename問題是必須手動處理,因爲名稱可以是如此不同。這首先表明了你如何允許數據輸入的一個問題。你不應該有這些重複的schemenames。

但是既然你這樣做了,我認爲最好的辦法是創建具有兩列的交叉引用表,如記錄方案和控制方案。選擇不同的方案名稱以創建可能的方案名稱列表並插入第一列。瀏覽列表並確定您想要爲每個名稱使用的schemename(大部分將與schemename相同)。完成此操作後,您可以加入此表以獲取查詢。這將適用於當前數據集,但是,您需要修復導致schemename的任何內容,以便進一步進行復制。 YOu也想修復它,所以當添加一個schemename時,你的表在兩個列中都填入新的schemename。然後,如果後來證明一個新的是重複的,你只需要在第二欄寫一個快速更新來顯示你真正完成了哪一個。

另一種方法是實際更新數據集中壞的方案名稱到正確的方案名稱。根據您必須更新的記錄數量以及多少表格,這可能是一個性能問題。這也僅適用於現在查詢數據,並沒有解決如何修正數據的問題。

相關問題