根据表格行输入值

inkz8wg9  于 2022-10-22  发布在  其他
关注(0)|答案(1)|浏览(129)

我想用以下设计在表格中输入新行

CREATE TABLE DMZ
(
DDM date NOT NULL,
NDM int NOT NULL,
PR int NOT NULL
CONSTRAINT PK_DMZ PRIMARY KEY(NDM)
);

PR只能是1或2,我将其定义为约束。(如果此文档是收入文档,则为1;如果此文档为消费文档,则是2。DM是文档编号(在我的情况下,实际上是Id)。

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

INSERT INTO DMZ(DDM, PR) VALUES(GETDATE(), X)

在X中,我想使用类似“计数PR=1的行和PR=2的行,如果PR=1有更多的行,则在新插入的行中使用PR=2,如果PR=2有更多行,则使用PR=1。附言:这是对我删除的答案的再创造,希望现在清楚了。对于那些问我为什么要做这样一件事的人来说,这是我必须完成的任务清单的一部分。我尝试过这样做,但我不知道如何用PR执行这一部分

INSERT INTO DMZ(ddm, pr)
SELECT COUNT(CASE WHEN (COUNT(CASE WHEN PR = 1 THEN 1 ELSE 0 END)> COUNT(CASE WHEN PR = 2 THEN 1 ELSE 0 END)) THEN 1 ELSE 2 END) AS pr, GETDATE() as ddm
FROM DMZ
wgx48brx

wgx48brx1#

尝试用CASE语句执行INSERTSELECT,在子查询中使用SUMCASE检查PR计数:

INSERT INTO DMZ (a.DDM, a.NDM, a.PR)
SELECT GETDATE() AS DOM,
       a.NDM AS NDM, 
       CASE WHEN a.PR_1_Count > a.PR_2_Count 
        THEN 2
        ELSE 1
       END AS PR
FROM (SELECT
        MAX(NDM) + 1 AS NDM,
        SUM(CASE WHEN PR = 1 THEN 1 ELSE 0 END) AS PR_1_Count, 
        SUM(CASE WHEN PR = 2 THEN 1 ELSE 0 END) AS PR_2_Count
       FROM DMZ) a

小提琴。

**注:**如果希望插入实际计数,请删除CONSTRAINT进行PR检查,并将CASE语句从THEN 2更改为THEN PR_2_CountTHEN 1改为m1n 11o1p。

此外,我在演示中硬编码了一个NDM列值,因为您的列设置为NOT NULL,我想您会处理这个问题。

**更新:**根据您下面的评论,我已经更新了语法以包含MAX(NDM) + 1。但是,我建议添加一个新的NDMIDENTITY列来替换当前的m1on17o1p栏,这样它将为您生成PK,而不是自己生成值(请参阅随附的Fiddle示例)。阅读有关IDENTITYhere以及如何操作here的更多信息。

标识列可用于生成键值。列上的标识属性保证以下内容:
每个新值都基于当前种子和增量生成。
特定事务的每个新值都不同于表中的其他并发事务。
列的标识属性不能保证以下内容:
值的唯一性-必须使用PRIMARY KEY或UNIQUE约束或UNIKE索引来强制唯一性。

相关问题