我正在努力通过将超量表连接到购买表来将值转换为超量,但是对于总结购买的报告,我很难避免将超量放入组中。下面是我当前的代码和我正在使用的过冲表。我认为这可以通过 CTE 来解决,但我还没有成功。
SELECT
,ID
,LEFT(RIGHT('000000000000' + SUM(CustomerPaid),12),11) + o1.overpunch
,LEFT(RIGHT('000000000000' + SUM(CustomerSaved),12),11) + o2.overpunch
FROM Table
LEFT JOIN OverPunch_Values o1
ON RIGHT(CustomerPaid, 1) = o1.numeric AND SIGN(CustomerPaid) = o1.VarCharSign
LEFT JOIN OverPunch_Values o2
ON RIGHT(CustomerSaved, 1) = o2.numeric AND SIGN(CustomerSaved) = o2.VarCharSign
GROUP BY ID, o1.overpunch, o2.overpunch
重拳 | 数字 | 签名 | VarCharSign |
---|---|---|---|
} | 0 | -1 | -1 |
J | 1 | -1 | -1 |
K | 2 | -1 | -1 |
L | 3 | -1 | -1 |
M | 4 | -1 | -1 |
N | 5 | -1 | -1 |
O | 6 | -1 | -1 |
P | 7 | -1 | -1 |
问 | 8 | -1 | -1 |
R | 9 | -1 | -1 |
{ | 0 | 0 | 1 |
A | 1 | 1 | 1 |
B | 2 | 1 | 1 |
C | 3 | 1 | 1 |
D | 4 | 1 | 1 |
E | 5 | 1 | 1 |
F | 6 | 1 | 1 |
G | 7 | 1 | 1 |
H | 8 | 1 | 1 |
我 | 9 | 1 | 1 |
{ | 0 | 0 | 0 |
(哇,我已经很久没有看到 IBM/EBCDIC 分区十进制数字表示法(又名overpunch)了,而且这是从遗留数据转换而来,而不是转换为。令人惊讶有时遗留数据格式会保留多久。)
我发现您当前的查询存在一些问题。
CustomerPaid
和 CustomerSaved
值的总和,但正在使用各个(未求和)值加入到您的过冲表中。在执行连接之前,您需要对子选择或 CTE 中的值进行分组和求和。CONCAT()
函数来解决,该函数可以方便地执行相同的操作。ABS()
消除可能的符号字符。更正后的查询将类似于:
WITH SumData AS (
SELECT
ID,
SUM(CustomerPaid) AS SumCustomerPaid,
SUM(CustomerSaved) AS SumCustomerSaved
FROM Data
GROUP BY ID
)
SELECT
ID
, SumCustomerPaid
, SumCustomerSaved
, LEFT(RIGHT(CONCAT('000000000000', ABS(SumCustomerPaid)), 12), 11) + o1.overpunch AS EncodedCustomerPaid
, LEFT(RIGHT(CONCAT('000000000000', ABS(SumCustomerSaved)), 12), 11) + o2.overpunch AS EncodedCustomerSaved
FROM SumData
LEFT JOIN OverPunch_Values o1
ON RIGHT(SumCustomerPaid, 1) = o1.numeric AND SIGN(SumCustomerPaid) = o1.VarCharSign
LEFT JOIN OverPunch_Values o2
ON RIGHT(SumCustomerSaved, 1) = o2.numeric AND SIGN(SumCustomerSaved) = o2.VarCharSign
结果示例:
身份证号码 | 客户支付金额 | 客户保存总和 | 编码客户付费 | 已编码的客户已保存 |
---|---|---|---|---|
1 | 0 | 0 | 00000000000{ | 00000000000{ |
2 | 1 | -1 | 00000000000A | 00000000000J |
3 | 555 | -555 | 00000000055E | 00000000055N |
4 | 123456789012 | -123456789012 | 12345678901B | 12345678901K |
5 | 999999999999 | -999999999999 | 99999999999I | 99999999999R |
请参阅 this db<>fiddle 进行演示。
以上假设为整数。如果您的
CustomerPaid
和 CustomerSaved
具有小数/小数部分,则需要适当缩放值,例如乘以 100,然后四舍五入/截断为整数。