处理SQL数据问题的最佳方法

3

我有一个数据密集型问题,需要大量的数据处理和操作,我在这里发布出来,看看是否有人有想法如何解决它。

简单来说,我有很多表格,可以联合起来给我提供牙医价格列表,以及每个牙医对于某项手术收费的金额。

因此,我们有多个类似下面这样的表格。

Dentist | Procedure1 | Procedure2 | Procedure3 | .........| Procedure?
John    | 500        | 342        | 434        | .........| 843
Dave    | 343        | 434        | 322        | NULLs....|
Mary    | 500        | 342        | 434        | .........| 843
Linda   | 500        | 342        | Null       | .........| 843

牙医可以有不同数量的程序和每个程序的不同定价。但是有很多牙医具有相同数量的程序和相应的相同价格。在内部,我们为每个所谓的费用清单创建一个唯一的ID。
例如,John将是001,Dave将是002,但Mary将是费用001,Linda将是003。如果我只需要处理这些数据一次,那么情况就不会太糟糕,但是这些费用列表以平面文件(csv)的形式出现,我基本上必须将它们DTS到SQL服务器中才能使用,并且它们每月都会出现。每个牙医的定价可能会从一个月变化到另一个月,这将使它们在内部具有不同的唯一ID。
有人能够解释一下如何最好地解决这个问题,以便在每月处理时最有效,而无需进行大量的数据操作吗?
以下是需要回答的问题:
1.查找费用清单的重复项的最佳方法是什么? 2.如何跟踪更新牙医的费用清单,以防他们在下个月更改费率?如果Mary决定为procedure2收取不同的费用,那么她在内部将有一个不同的唯一ID。如何在每月基础上跟踪这一点,而无需删除所有内容并重新插入? 3.我正在处理几百万个费用清单,其中一些基于邮政编码具有标准规则,而其他一些则只是唯一的费用清单,这里的方法是什么? 4.我可以编写某种临时的.NET程序来处理它,但是这是大量的数据,直接在SQL服务器中工作对我来说会更容易。
1个回答

1
您可能需要对数据进行反转枢轴操作以将其规范化 - 以便最终得到:
Doctor: DoctorID, DoctorDetails...
FeeSchedule: DoctorID, ScheduleID, EffectiveDate, OtherDetailAtThisLevel...
FeeScheduleDetail: ScheduleID, ProcedureCode, Fee, OtherDetailAtThisLevel...

当医生的数据到来时,它会被透视,创建一个新的日程表,并从未透视的数据中创建详细行。

SSIS有一个未透视组件,很好用 - 你可以先加载日程表,然后再加载详细信息。如果格式差异很大,你可能需要一个自定义数据源或者避免使用SSIS。

这个系统将跟踪医生的新日程表。如果医生的日程表相同,你可以选择不插入它。

如果这个逻辑很复杂,你可以将数据加载到临时表(使用SSIS或其他工具),并在SQL中完成所有操作(T-SQL也有UNPIVOT运算符)。这样做的优点是代码都在一个地方,可以对所有操作进行集合处理。

关于邮政编码,如果医生没有费用,这些费用是否像通常和习惯性的费用一样?这可以通过医生行的邮政编码简单确定。在这种情况下,你有几个选择。你可以将医生的费用计划覆盖在邮政编码费用计划上:

ZipCodeSchedule: ZipScheduleID, ZipCode, EffectiveDate
ZipCodeScheduleDetail: ZipScheduleID, ProcedureCode, Fee

或者你可以将其保存在常规费用表中(可能带有某种标记,以指示它默认为 UCR)。

很遗憾,我们为这些费用清单创建了内部唯一标识符。所以如果一个医生共享相同的费用清单,它们将具有相同的内部唯一标识符。这是一次归一化失败的尝试。但这只适用于个别情况。现在我们有基于邮政编码的区域费用清单。现在,如果这些费用计划清单发生变化,实际上没有办法跟踪它们,因为相同的邮编可能会根据费用清单类型而有不同的费用清单。 - stevenjmyu
@megatoast,在这种情况下,我的邮政编码时间表需要在ZipCode、FeeType和EffectiveDate上有一个唯一的ekey。 - Cade Roux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接