Sql server SQL Server 2008:生成唯一项表

Sql server SQL Server 2008:生成唯一项表,sql-server,tsql,sql-server-2008,unique,Sql Server,Tsql,Sql Server 2008,Unique,我有以下问题。我有一个包含几十万条记录的表,它有以下标识符(为了简单起见) 我需要做的是将其转换为一条如下所示的记录: MemberID SchemeName B1 B2 B3 10 ABC 12000 5000 11000 当然,问题是我需要通过SchemeName进行区分,对于大多数记录来说,这不会是一个问题,但对于某些SchemeName来说,不会被正确捕

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

我需要做的是将其转换为一条如下所示的记录:

MemberID      SchemeName        B1       B2      B3        
10            ABC               12000    5000    11000     
当然,问题是我需要通过SchemeName进行区分,对于大多数记录来说,这不会是一个问题,但对于某些SchemeName来说,不会被正确捕获。现在,我并不特别关心转换后的表是否使用“ABC”或“A.B.C”作为方案名称,只要它只使用其中的一个

我想听听你的建议

谢谢
卡尔


(使用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)

schemename问题必须手动处理,因为名称可能会非常不同。这首先表明了您如何允许数据输入的问题。您不应该有这些重复的schemeName

然而,既然这样做了,我认为最好的办法是创建具有两列的交叉引用表,类似于recordedscheme和Control scheme。选择distinct scheme name以创建可能的SchemeName列表并插入到第一列中。浏览该列表并确定您想要为每一个使用的schemename是什么(大多数与schemename相同)。完成此操作后,可以加入此表以获取查询。这将适用于当前的数据集,但是,您需要修复导致schemename重复的任何问题。您还需要修复它,以便在添加schemename时,表的两列中都会填充新的schemename。然后,如果后来发现一个新的是重复的,那么你所要做的就是在第二列写一个快速更新,显示它到底是哪一个,然后你就完成了


另一种方法是将数据集中坏的schemeName实际更新为正确的schemeName。根据需要更新的记录数和表数,这可能是一个性能问题。这也只适用于当前查询数据,而不解决如何修复数据。

可能有多少BenefitID值?每个MemberID和SchemeName都是一样的吗?@Karl,根据您的评论,您似乎有两个问题:将行合并到列中,以及如何根据不同的文本字段合并行。更难的是基于不同文本合并行,所以为什么不详细阐述一下呢。给出一些很好的例子,说明你在处理什么,以及什么是可以接受的,因为任何算法都不会100%准确。如果你心中有一个匹配这些的算法,即使它只是一个想法(不是代码),也要给出它。否则,你的问题中没有太多的信息,你也不可能得到更多的帮助。好的,如果我只需要删除标点符号,这将解决问题。但这只是一个武断的例子。如果我有“ABC”和“ABC方案bleh”等怎么办@Karl,如果你有如此大的不同方案,你就不走运了,你需要手动清理数据。我只是猜测,但可能您需要更改应用程序,为用户提供一个选择框,其中包含要选择的有效值,而不是自由文本,以输入他们想要的内容。您必须选择一个。例如,用
MIN(SchemeName)
替换
Replace(SchemeName,,”)
。这个答案可能有助于如何加入/组合/匹配不同的自由文本值:数据透视将非常有效,但我仍然需要处理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)