代码之家  ›  专栏  ›  技术社区  ›  Karl

SQL Server 2008:生成唯一项表

  •  1
  • Karl  · 技术社区  · 16 年前

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

    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”作为方案名称,只要它只使用其中的一个。

    我想听听你的建议。


    卡尔

    (使用SQL Server 2008)

    3 回复  |  直到 16 年前
        1
  •  2
  •   KM.    16 年前

    根据原始问题中的有限信息,尝试一下:

    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)
    
        2
  •  0
  •   Prashant Lakhlani    16 年前

    看来 PIVOTS 可以帮助

        3
  •  0
  •   HLGEM    16 年前

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

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

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

    推荐文章