You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

语句说明

  1. 避免聚合嵌套:直接在CASE语句中比较两类PR值的统计结果,不再嵌套聚合函数,符合SQL语法规范。
  2. 主键处理:NDM是NOT NULL的主键,必须提供唯一值,这里用MAX(NDM)+1生成下一个编号,空表时通过ISNULL确保初始值为1,你也可以根据实际场景改用自增序列等方式。
  3. 自动选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:45:33