2010-03-03 2 views
1

다음과 같은 문제가 있습니다.SQL Server 2008 : 고유 항목 테이블 생성

MemberID  SchemeName  B1  B2  B3   
10   ABC    12000 5000 11000  
: 나는 내가해야 할 것은 다음과 같다 단일 레코드에이를 변환하는 것입니다

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

(편의상) 다음과 같은 식별자를 가지고 천 몇 백 기록이있는 테이블을 가지고

물론 SchemeName으로 구분해야하는 문제는 대부분의 레코드에서 문제가되지 않지만 일부 SchemeName에서는 제대로 캡처되지 않습니다. 이제는 변환 된 테이블에서 스키마 이름으로 "ABC"또는 "A.B.C"를 사용하는 경우 특히 그 중 하나만 사용하는 한 신경 쓰지 않습니다.

나는 당신의 제안을 듣고 싶습니다.

감사

+0

얼마나 많은 BenefitID 값을 사용할 수 있습니까? 그들은 모든 MemberID와 SchemeName에서 동일합니까? –

+1

@ Karl, 귀하의 의견을 바탕으로 두 가지 문제가있는 것 같습니다 : 열을 열로 결합하고 다양한 텍스트 필드를 기반으로 행을 결합하는 방법. 다양한 텍스트를 기반으로 행을 결합하는 것이 어렵습니다. 더 자세히 설명하지 않으십시오. 어떤 알고리즘이 결코 100 % 정확하지 않기 때문에, 상대방이 다루는 것에 대한 좋은 예와 일치하는만큼 받아 들일 수있는 것을 제공하십시오. 일치하는 알고리즘을 알고 있다면 (코드가 아닌) 아이디어 일뿐입니다. 그렇지 않으면 질문에 계속할 정보가별로 없기 때문에 더 많은 도움을 얻지 못할 것입니다. –

답변

2

는,이 시도주고 도움을 줄 수 있음을 보인다 (SQL Server 2008에 사용) :

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

구두점을 제거해야하는 경우 문제가 해결됩니다. 그러나 이것은 단지 임의적 인 예일뿐입니다. "ABC"와 "The ABC scheme bleh"등이 있다면 어떻게 되겠습니까? – Karl

+1

@ 카를, 당신이 운이 좋지 않은 상당히 다른 SchemeNames를 가지고 있다면, 수동으로 데이터를 정리해야 할 것입니다. 나는 단지 추측하고 있지만 응용 프로그램을 변경하여 유효한 값의 선택 상자로 사용자에게 표시하고 원하는 텍스트를 입력 할 때 텍스트를 자유롭게 사용하지 않아야합니다. –

+0

하나를 골라야합니다. 예를 들어,'REPLACE (SchemeName, '.', '')'를'MIN (SchemeName)'으로 대체하십시오. –

0

그것은 PIVOTS은 원래의 질문에 제한된 정보를 기반으로

+0

피벗은 훌륭하게 작동하지만 여전히 SchemeName 문제를 처리해야합니다. – Karl

0

스키마 이름 문제는 이름이 매우 다를 수 있으므로 수동으로 처리해야하는 문제입니다. 이는 데이터 입력을 허용하는 방법에있어서 가장 중요한 문제점을 나타냅니다. 이 중복 된 스키마 이름을 가져서는 안됩니다.

그러나 당신이 생각하기에, 최선의 방법은 레코드 열과 제어 체계와 같은 두 개의 열이있는 상호 참조 테이블을 만드는 것입니다. 고유 스키마 이름을 선택하여 가능한 스키마 이름 목록을 작성하고 첫 번째 열에 삽입하십시오. 목록을 살펴보고 각각에 대해 사용하려는 schemename이 무엇인지 결정하십시오 (대부분 schembe와 동일합니다). 이 작업을 완료하면이 테이블에 가입하여 쿼리를 가져올 수 있습니다. 이것은 현재 데이터 세트에 대해 작동하지만, 복제본을 추가로 얻으려면 스키마 이름의 원인을 수정해야합니다. 스키마 이름을 추가 할 때 테이블에 두 개의 열에 새 스키마 이름이 채워지도록 수정할 수도 있습니다. 그런 다음 나중에 새 복제본이 복제본이라는 사실이 밝혀지면 두 번째 열에 대한 빠른 업데이트를 작성하여 실제로 어떤 복제본인지, 그리고 완료했는지 여부를 보여주는 작업 만 수행하면됩니다.

데이터 세트의 잘못된 스키마 이름을 실제로 올바른 것으로 업데이트하는 것입니다. 업데이트해야하는 레코드 수와 테이블 수에 따라 성능 문제가 발생할 수 있습니다. 이는 현재 데이터를 쿼리하는 데만 유용하며 데이터를 수정하는 방법을 다루지는 않습니다.