SQL Server 2008: создать таблицу уникальных записей - PullRequest
1 голос
/ 03 марта 2010

У меня следующая проблема. У меня есть таблица с несколькими сотнями тысяч записей, которая имеет следующие идентификаторы (для простоты)

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 из них.

Мне бы очень хотелось услышать ваши предложения.

Спасибо
Karl

(с использованием SQL Server 2008)

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

на основании ограниченной информации в исходном вопросе, попробуйте:

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 голосов
/ 03 марта 2010

Проблема с именем схемы должна решаться вручную, поскольку имена могут быть такими разными. Это указывает прежде всего на проблему с тем, как вы разрешаете ввод данных. Вы не должны иметь эти дубликаты схем.

Однако, поскольку вы это делаете, я думаю, что лучше всего создать таблицу перекрестных ссылок с двумя столбцами, что-то вроде записанной схемы и схемы управления. Выберите отдельное имя схемы, чтобы создать список возможных имен схем и вставить в первый столбец. Просмотрите список и определите, какое имя схемы вы хотите использовать для каждого (большинство будет таким же, как имя схемы). Как только вы это сделаете, вы можете присоединиться к этой таблице, чтобы получить запрос. Это будет работать для текущего набора данных, однако вам нужно исправить все, что приводит к дублированию имени схемы перед тем, как идти дальше. Вы также захотите исправить это, чтобы при добавлении имени схемы ваша таблица заполнялась новым именем схемы в обоих столбцах. Затем, если позже выясняется, что новый является дубликатом, все, что вам нужно сделать, это написать быстрое обновление для второго столбца, показывающее, какой это на самом деле, и бум вы сделали.

Альтернатива состоит в том, чтобы фактически обновить неправильные имена схем в наборе данных. В зависимости от того, сколько записей вам нужно обновить и в скольких таблицах, это может быть проблемой производительности. Это также полезно только для запроса данных прямо сейчас и не учитывает, как исправить эти данные.

0 голосов
/ 03 марта 2010

Похоже, что PIVOTS может помочь

...