SQL插入DMZ表:按PR值行数自动选值的语句报错问题
问题解决:根据PR值现有行数自动选择新行PR值插入
你的表结构、约束及初始数据如下:
CREATE TABLE DMZ ( DDM date NOT NULL, NDM int NOT NULL, PR int NOT NULL CONSTRAINT PK_DMZ PRIMARY KEY(NDM) ); ALTER TABLE DMZ ADD CONSTRAINT PR CHECK (PR IN (1,2)); INSERT INTO DMZ VALUES('2014.01.04', 20, 1); INSERT INTO DMZ VALUES('2014.01.04', 21, 1); INSERT INTO DMZ VALUES('2014.01.04', 22, 2);
需求为插入新行时自动判断:
- 若PR=1的行数更多,新行PR设为2
- 若PR=2的行数更多,新行PR设为1
你原语句报错的原因是在聚合函数内部嵌套了另一个聚合函数,SQL不允许这种嵌套写法。以下是正确的实现方案:
正确SQL语句(含主键处理)
INSERT INTO DMZ(DDM, NDM, PR) SELECT GETDATE(), -- 生成唯一主键NDM:取现有最大值+1,空表时默认1 ISNULL(MAX(NDM), 0) + 1, CASE WHEN COUNT(CASE WHEN PR = 1 THEN 1 END) > COUNT(CASE WHEN PR = 2 THEN 1 END) THEN 2 ELSE 1 END FROM DMZ;
语句说明
- 避免聚合嵌套:直接在CASE语句中比较两类PR值的统计结果,不再嵌套聚合函数,符合SQL语法规范。
- 主键处理:NDM是NOT NULL的主键,必须提供唯一值,这里用
MAX(NDM)+1生成下一个编号,空表时通过ISNULL确保初始值为1,你也可以根据实际场景改用自增序列等方式。 - 自动选择PR值:通过CASE判断两类行数的大小关系,返回对应的PR值。
简洁写法(用SUM统计行数)
INSERT INTO DMZ(DDM, NDM, PR) SELECT GETDATE(), ISNULL(MAX(NDM), 0) + 1, CASE WHEN SUM(CASE WHEN PR=1 THEN 1 ELSE 0 END) > SUM(CASE WHEN PR=2 THEN 1 ELSE 0 END) THEN 2 ELSE 1 END FROM DMZ;
内容的提问来源于stack exchange,提问作者Palamar66
相关产品推荐
相关产品推荐

