Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 插入零值行_Sql - Fatal编程技术网

Sql 插入零值行

Sql 插入零值行,sql,Sql,我有以下结构。我想要实现的是,如果出于某种原因,其中一个类别不存在,那么与其说该类别没有行,不如说该类别应该有一个x/y/z为零的行 下面的问题似乎有点复杂-实现这一点的正确方法是什么 TRUNCATE TABLE dbo.xxx; INSERT INTO dbo.xxx values ('cat_1',0.0,0.0,0.0), ('cat_2',0.0,0.0,0.0), ('cat_3',0.0,0.0,0.0), ('cat_4',0.0,0.0,

我有以下结构。我想要实现的是,如果出于某种原因,其中一个类别不存在,那么与其说该类别没有行,不如说该类别应该有一个x/y/z为零的行

下面的问题似乎有点复杂-实现这一点的正确方法是什么

TRUNCATE TABLE dbo.xxx;
INSERT INTO dbo.xxx
    values
    ('cat_1',0.0,0.0,0.0),
    ('cat_2',0.0,0.0,0.0),
    ('cat_3',0.0,0.0,0.0),
    ('cat_4',0.0,0.0,0.0);


--:: category 1
INSERT INTO dbo.xxx
SELECT  Category = 'cat_1',
        x       = SUM(x),
        y       = SUM(y),
        z       = SUM(z)    
FROM    dbo.yyy x
WHERE   DateKey >= period1;

--:: category 2
INSERT INTO dbo.xxx
SELECT  Category = 'cat_2',
        x       = SUM(x),
        y       = SUM(y),
        z       = SUM(z)    
FROM    dbo.yyy x
WHERE   DateKey >= period2;

--:: category 3
INSERT INTO dbo.xxx
SELECT  Category = 'cat_3',
        x       = SUM(x),
        y       = SUM(y),
        z       = SUM(z)    
FROM    dbo.yyy x
WHERE   DateKey >= period3;

--:: category 4
INSERT INTO dbo.xxx
SELECT  Category = 'cat_4',
        x       = SUM(x),
        y       = SUM(y),
        z       = SUM(z)    
FROM        dbo.yyy x
WHERE   DateKey >= period4;

SELECT  Category,
        x       = SUM(x),
        y       = SUM(y),
        z       = SUM(z)
INTO    #temp
FROM    dbo.xxx
GROUP BY Category;

TRUNCATE TABLE dbo.xxx;

INSERT INTO dbo.xxx
SELECT * FROM #temp;

您可以使用
COALESCE
NVL
来定义
NULL

--:: category 1
INSERT INTO dbo.xxx
SELECT  Category = 'cat_1',
        x       = COALESCE (SUM(x),0),
        y       = COALESCE (SUM(y),0),
        z       = COALESCE (SUM(z),0)    
FROM    dbo.yyy x
WHERE   DateKey >= period1;

你想要达到的目标并不完全有意义。@astander我认为它是很久以前写的,以至于我错过了Trinimon指出的
COALESCE
函数的明显用途+1不需要group by-但是
COALESCE
的加入已经解决了它-令人惊讶的是,你可以在legacy中找到解决方法密码!您的问题与哪个数据库相关?由于
TRUNCATE
我以为是ORACLE,但不是,是吗?我只是好奇……;)SQL Server,但我认为脚本是标准的?只是浏览了一些文档-实际上似乎很标准,除了SQLite和其他相当紧凑的数据库。很高兴知道。。。