SQL Server 表结构优化与字段计算

学习笔记作者:admin日期:2025-05-28点击:26

摘要:针对现有SQL Server表结构,提供了优化方案,包括字段计算逻辑与数据规范化建议。

SQL Server 表结构优化与字段计算

背景

      当前表结构存在宽表形式,导致查询复杂且不易扩展,需要优化字段计算与数据结构。

优化建议

      优化分为两种方式:
1. 在现有表结构上使用SQL聚合计算;
2. 规范化表结构,拆分明细表。

现有表结构优化SQL

SELECT 
    [ID],
    [sys_ID],
    [客户名称],
    [业务员],
    -- 最近收款日期
    (SELECT MAX(收款日期) FROM (
        VALUES 
            ([收款1_日期]), ([收款2_日期]), ([收款3_日期]),
            ([收款4_日期]), ([收款5_日期]), ([收款6_日期]),
            ([收款7_日期]), ([收款8_日期]), ([收款9_日期]),
            ([收款10_日期])
    ) AS 收款日期(日期)) AS 最近收款日期,
    -- 收款合计
    (ISNULL([收款1_金额], 0) + ISNULL([收款2_金额], 0) +
     ISNULL([收款3_金额], 0) + ISNULL([收款4_金额], 0) +
     ISNULL([收款5_金额], 0) + ISNULL([收款6_金额], 0) +
     ISNULL([收款7_金额], 0) + ISNULL([收款8_金额], 0) +
     ISNULL([收款9_金额], 0) + ISNULL([收款10_金额], 0)
    ) AS 收款合计,
    -- 最新开票日期
    (SELECT MAX(开票日期) FROM (
        VALUES 
            ([开票_日期]), ([开票2_日期])
    ) AS 开票日期(日期)) AS 最新开票日期,
    -- 开票合计
    (ISNULL([开票_金额], 0) + ISNULL([开票2_金额], 0)) AS 开票合计
FROM [收款记录];

规范化表结构

      创建新表结构,包括客户主表、收款明细表和开票明细表。
示例SQL如下:

SELECT 
    c.ID,
    c.sys_ID,
    c.客户名称,
    c.业务员,
    MAX(r.收款日期) AS 最近收款日期,
    SUM(r.收款金额) AS 收款合计,
    MAX(i.开票日期) AS 最新开票日期,
    SUM(i.开票金额) AS 开票合计
FROM [客户信息] c
LEFT JOIN (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY 客户ID ORDER BY 收款日期 DESC) AS rn
    FROM [收款明细]
) r ON c.ID = r.客户ID AND r.rn <= 10
LEFT JOIN (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY 客户ID ORDER BY 开票日期 DESC) AS rn
    FROM [开票明细]
) i ON c.ID = i.客户ID AND i.rn <= 10
GROUP BY c.ID, c.sys_ID, c.客户名称, c.业务员;

总结

      推荐规范化表结构,便于扩展和查询性能优化。如果无法修改表结构,可采用现有结构上的SQL聚合计算。

上一篇      下一篇