我有以下问题。我有一个包含几十万条记录的表,它有以下标识符(为简单起见)
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)
答案 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。然后,如果它后来证明一个新的是重复的,你所要做的就是在第二列写一个快速更新,显示它真正是哪一个并且繁荣你完成了。
另一种方法是实际将数据集中的错误模型更新为正确的模式。根据您需要更新的记录数量和表数量,这可能是一个性能问题。这也仅适用于现在查询数据,而不是解决如何修复数据的问题。