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聚合计算。