我想用以下设计在表格中输入新行
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
1条答案
按热度按时间wgx48brx1#
尝试用
CASE
语句执行INSERT
SELECT
,在子查询中使用SUM
和CASE
检查PR
计数:小提琴。
**注:**如果希望插入实际计数,请删除
CONSTRAINT
进行PR检查,并将CASE
语句从THEN 2
更改为THEN PR_2_Count
,THEN 1
改为m1n 11o1p。此外,我在演示中硬编码了一个
NDM
列值,因为您的列设置为NOT NULL
,我想您会处理这个问题。**更新:**根据您下面的评论,我已经更新了语法以包含
MAX(NDM) + 1
。但是,我建议添加一个新的NDM
IDENTITY
列来替换当前的m1on17o1p栏,这样它将为您生成PK
,而不是自己生成值(请参阅随附的Fiddle示例)。阅读有关IDENTITY
列here以及如何操作here的更多信息。标识列可用于生成键值。列上的标识属性保证以下内容:
每个新值都基于当前种子和增量生成。
特定事务的每个新值都不同于表中的其他并发事务。
列的标识属性不能保证以下内容:
值的唯一性-必须使用PRIMARY KEY或UNIQUE约束或UNIKE索引来强制唯一性。