如何在没有光标的T-SQL中记录两个记录之间的记录?这种类型的数据布局叫什么?

时间:2014-02-19 19:54:25

标签: tsql

我在工作中看到了一些有趣的数据。它的布局类似于:

 DATE
 Tran ID TRANSACTION
 Tran ID TRANSACTION
 Tran ID TRANSACTION
 NEXT DATE
 Tran ID TRANSACTION
 Tran ID TRANSACTION
 THIRD DATE
 Tran ID TRANSACTION

例如:

 20140219
 Tran 1 10.00
 Tran 1 Beneficiary ABC Originator XYZ
 Tran 2 20.00
 Tran 2 Beneficiary 123 Originator ABC
 Tran 2 NOTE: bleh bleh bleh
 Tran 3 10.00
 Tran 3 Beneficiary XYZ originator ABC
 20140218
 Tran 4 10.00
 Tran 4 Beneficiary ABC Originator XYZ
 Tran 5 20.00
 Tran 5 Beneficiary 123 Originator ABC

首先,这个布局叫什么?它看起来像是一条日期记录,而日期的附录是交易,但每笔交易都取决于Tran ID。具有相同ID的交易是相关的。

其次,我正在尝试计算每个日期的记录。因此,对于提供的示例,它将是

 20140219 = 8 Records
 20140218 = 5 Records

到目前为止,我只能通过创建一个额外的列并使用游标循环遍历字符串并在前8个字符中查找日期来实现此目的。如果前8个字符是日期然后更新,则将日期分配给变量并将变量分配给所有以下字符串,直到它到达下一个日期并再次更新日期。所以数据看起来像这样:

 Manipulated Data:
 20140219 20140219 
 20140219 Tran 1 10.00
 20140219 Tran 1 Beneficiary ABC Originator XYZ
 20140219 Tran 2 20.00
 20140219 Tran 2 Beneficiary 123 Originator ABC
 20140219 Tran 2 NOTE: bleh bleh bleh
 20140219 Tran 3 10.00
 20140219 Tran 3 Beneficiary XYZ originator ABC
 20140218 20140218 
 20140218 Tran 4 10.00
 20140218 Tran 4 Beneficiary ABC Originator XYZ
 20140218 Tran 5 20.00
 20140218 Tran 5 Beneficiary 123 Originator ABC

然后我使用以下查询来计算信息:

 SELECT LEFT(string,8), COUNT(*) FROM table
 GROUP BY Left(string,8)

然而,我被告知"一个好的查询编写者可以编写没有光标的代码"。目前我在没有光标的情况下如何做到这一点。我似乎有一些非常有创意的方法来克服StackOverflow上的问题,我想我会在这里问一下是否有人有解决方案。

1 个答案:

答案 0 :(得分:0)

如果您将其作为平面文件加载,那么至少在表格上放置一个iden PK,以便您可以重现订单。

没有光标,你不能解析那些数据 但是为什么要等到加载它来解析呢? 在.NET或您喜欢的框架中逐行阅读,然后解析它。

我看到了 iden(PK)int32
日期日期时间
tran SmallInt
text varchar(800)

您可以将其分解为金额,受益人,发起人和备注 解析会有点复杂但不错