SQL Server 2008:生成唯一条目表

时间:2010-03-03 14:01:59

标签: sql-server tsql sql-server-2008 unique

我有以下问题。我有一个包含几十万条记录的表,它有以下标识符(为简单起见)

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)

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

看起来PIVOTS可以提供帮助

答案 2 :(得分:0)

由于名称可能如此不同,因此必须手动处理schemename问题。这首先表明了如何允许数据输入的问题。你不应该有这些重复的schemenames。

然而,既然如此,我认为最好的事情是创建具有两列的交叉引用表,类似于recordedscheme和控制方案。选择不同的方案名称以创建可能的模型名称列表并插入第一列。浏览列表并确定要为每个模板使用的模式名称(大多数与模式名称相同)。完成此操作后,您可以加入此表以获取查询。这将适用于当前数据集,但是,您需要修复导致schemename重复进一步的任何问题。你也想修复它,所以当添加一个schemename时,你的表中会填充两个列中的新schemename。然后,如果它后来证明一个新的是重复的,你所要做的就是在第二列写一个快速更新,显示它真正是哪一个并且繁荣你完成了。

另一种方法是实际将数据集中的错误模型更新为正确的模式。根据您需要更新的记录数量和表数量,这可能是一个性能问题。这也仅适用于现在查询数据,而不是解决如何修复数据的问题。