避免通过 SQL 将数据分组

问题描述 投票:0回答:1

我正在努力通过将超量表连接到购买表来将值转换为超量,但是对于总结购买的报告,我很难避免将超量放入组中。下面是我当前的代码和我正在使用的过冲表。我认为这可以通过 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
sql-server
1个回答
0
投票

哇,我已经很久没有看到 IBM/EBCDIC 分区十进制数字表示法(又名overpunch)了,而且这是从遗留数据转换而来,而不是转换为。令人惊讶有时遗留数据格式会保留多久。)

我发现您当前的查询存在一些问题。

  1. 您似乎希望获得
    CustomerPaid
    CustomerSaved
    值的总和,但正在使用各个(未求和)值加入到您的过冲表中。在执行连接之前,您需要对子选择或 CTE 中的值进行分组和求和。
  2. 您对值进行零填充的尝试不起作用,因为在“添加”混合值时,加法运算符会将字符串转换为数字,而不是将数字转换为字符串。这可以通过显式地将数字转换为字符串或使用
    CONCAT()
    函数来解决,该函数可以方便地执行相同的操作。
  3. 要正确处理负数,您需要在格式化数字时使用
    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,然后四舍五入/截断为整数。

© www.soinside.com 2019 - 2024. All rights reserved.