Sql 在一个表中添加行,该表由其他行组成

Sql 在一个表中添加行,该表由其他行组成,sql,postgresql,Sql,Postgresql,我已经发布了一个到这一个,但现在的问题是另一个 我有一张桌子,上面有这样的箱子: disease | country | year | number | rate ------------+---------------------------------------+------+-----------+-------- Diphtheria | Austria

我已经发布了一个到这一个,但现在的问题是另一个

我有一张桌子,上面有这样的箱子:

  disease   |                country                | year |  number   |  rate
------------+---------------------------------------+------+-----------+--------
 Diphtheria | Austria                               | 1989 |    190.00 |   2.47
 Tetanus    | Austria                               | 1989 |       NaN |    NaN 
 Pertussis  | Austria                               | 1989 |      0.00 |   0.00
 Measles    | Austria                               | 1989 |       NaN |    NaN
 Mumps      | Austria                               | 1989 |      0.00 |   0.00
 Rubella    | Austria                               | 1989 |       NaN |    NaN
 Polio      | Austria                               | 1989 |       NaN |    NaN
 Diphtheria | Belgium                               | 1989 |    180.00 |   2.42
 Tetanus    | Belgium                               | 1989 |      5.00 |   0.04  
 Pertussis  | Belgium                               | 1989 |      1.00 |   0.01
 Measles    | Belgium                               | 1989 |      0.00 |   0.00
 Mumps      | Belgium                               | 1989 |   2052.00 |  50.00
 Rubella    | Belgium                               | 1989 |      0.00 |   0.00
 Polio      | Belgium                               | 1989 |       NaN |    NaN
 Diphtheria | Austria                               | 1990 |      5.00 |   0.01
 Tetanus    | Austria                               | 1990 |    152.00 |   2.41 
 Pertussis  | Austria                               | 1990 |      0.00 |   0.00
 Measles    | Austria                               | 1990 |    850.00 |   3.55
 Mumps      | Austria                               | 1990 |       NaN |    NaN
 Rubella    | Austria                               | 1990 |     55.00 |   3.00
 Polio      | Austria                               | 1990 |      0.00 |   0.00
 Diphtheria | Belgium                               | 1990 |    191.00 |   2.48
 Tetanus    | Belgium                               | 1990 |     20.00 |   2.00
 Pertussis  | Belgium                               | 1990 |      5.00 |   0.40
 Measles    | Belgium                               | 1990 |      0.00 |   0.00
 Mumps      | Belgium                               | 1990 |      0.40 |   0.02
 Rubella    | Belgium                               | 1990 |     85.00 |   6.08
 Polio      | Belgium                               | 1990 |     10.00 |   0.60
 ...        | ...                                   |  ... |       ... |    ...  
我想添加一些行,计算为一些值的总和。 我试着更好地解释自己

以下查询计算白喉、破伤风、百日咳和其他疾病的数值和比率值之和。。并创建一个包含求和值的行

查询:

SELECT 
    SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END) AS DTP_NUMBER,
    SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END) AS DTP_RATE,
    SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END) AS MMR_NUMBER,
    SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END) AS MMR_RATE,
    SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END) AS Polio_NUMBER,
    SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END) AS Polio_RATE,
    country,
    year
FROM cases
GROUP BY country, year;
我该怎么办? 我曾想过使用如下查询:

    INSERT INTO cases (column names) 
    VALUES (
            SELECT 
            SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END) AS DTP_NUMBER,
            SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END) AS DTP_RATE,
            SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END) AS MMR_NUMBER,
            SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END) AS MMR_RATE,
            SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END) AS Polio_NUMBER,
            SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END) AS Polio_RATE,
            country,
            year
        FROM cases
        GROUP BY country, year
    );
当我运行Pham X.Bach创建的查询时,我得到:

如果我更改以这种方式创建表的查询:

CREATE TABLE IF NOT EXISTS cases (
    id SERIAL PRIMARY KEY,
    disease VARCHAR(64) NOT NULL,
    country VARCHAR(255) NOT NULL,
    year NUMERIC(4) NOT NULL,
    number NUMERIC(20, 2) NOT NULL,
    rate NUMERIC(20, 2) NULL,
    UNIQUE (disease, country, year, number));
CREATE TABLE IF NOT EXISTS cases (
    id SERIAL PRIMARY KEY,
    disease VARCHAR(64) NOT NULL,
    country VARCHAR(255) NOT NULL,
    year NUMERIC(4) NOT NULL,
    number NUMERIC(20, 2),
    rate NUMERIC(20, 2),
    UNIQUE (disease, country, year, number));
然后我执行您的查询,我得到:

Error Message ERROR: A duplicate key value violates the unique constraint "cases_disease_country_year_number_key"
DETAIL:  The key (disease, country, year, number)=(Polio, United Kingdom, 1987, 0.00) yet exists.
如果我运行Anadi Sharma的查询,我会在第3行得到一个语法错误。

您可以使用:

INSERT INTO cases (
    disease, country, year, 
    number, 
    rate
) 
SELECT 
    'DTP' AS disease, country, year,
    COALESCE(SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END), 'NaN') AS number,
    COALESCE(SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END), 'NaN') AS rate
FROM cases
GROUP BY country, year
UNION ALL
SELECT 
    'MMR' AS disease, country, year,
    COALESCE(SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END), 'NaN') AS number,
    COALESCE(SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END), 'NaN') AS rate
FROM cases
GROUP BY country, year
UNION ALL
SELECT 
    'Polio_Sum' AS disease, country, year,
    COALESCE(SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END), 'NaN') AS number,
    COALESCE(SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END), 'NaN') AS rate
FROM cases
GROUP BY country, year
;

您的内部select查询的结构不是cases表。您应该使用union来解决此问题。尝试使用以下查询:

INSERT INTO cases 
    SELECT 
        disease,
        country,
        year,
        SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END) AS number,
        SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END) AS rate            
    FROM cases
    GROUP BY 1, 2, 3
    UNION ALL
    SELECT 
        disease,
        country,
        year,
        SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END) AS number,
        SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END) AS rate            
    FROM cases
    GROUP BY 1, 2, 3
    UNION ALL
    SELECT 
        disease,
        country,
        year,
        SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END) AS number,
        SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END) AS rate            
    FROM cases
    GROUP BY 1, 2, 3

您必须放置案例的列名table@schlonzo好的,但是查询结果的结构与我的cases表不同。列名的顺序并不重要,只要您提供所有列名,这不接受null。谢谢,但是存在一些问题。我更新了我的主要信息。@ColdFish,这和你之前的问题一样是一个问题。查看我的更新答案。我始终收到错误消息错误:重复的键值违反了唯一的约束条件。\u disease\u country\u year\u number\u key DETAIL:the key disease,country,year,number=脊髓灰质炎,United Kingdom,1987,0.00仍然存在…@ColdFish这是由于您的组命名,而不是查询中的错误。使用组DTP和MMR是可以的,因为它们的名称是唯一的。但这个组和您现有的数据组同名,所以当您尝试插入它时,它会产生重复的键值。在查询中,如果您将“脊髓灰质炎”作为疾病更改为“脊髓灰质炎”作为疾病,那么就可以了。哦,好的。非常感谢@ColdFish此查询有2个错误,首先是错误的语法插入到。。值选择。。。从中,第二个是非分组表达式。你应该把你之前的问题的链接贴出来,这样其他人就可以理解你的DTP,MMR,脊髓灰质炎组了。这是我的错!我的语法错了。请现在试着跑步!谢谢@AnadiSharma好的,现在我得到一个错误:列cases.disease必须出现在GROUPBY子句中,或者在聚合函数中使用。对不起,我只知道很少的sql…@PhamX.Bach你说得对!我将链接添加到中的上一个问题message@ColdFish是的,这个错误有道理,我的错又来了!我刚刚编辑了我的答案。
INSERT INTO cases (
    disease, country, year, 
    number, 
    rate
) 
SELECT 
    'DTP' AS disease, country, year,
    COALESCE(SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END), 'NaN') AS number,
    COALESCE(SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END), 'NaN') AS rate
FROM cases
GROUP BY country, year
UNION ALL
SELECT 
    'MMR' AS disease, country, year,
    COALESCE(SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END), 'NaN') AS number,
    COALESCE(SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END), 'NaN') AS rate
FROM cases
GROUP BY country, year
UNION ALL
SELECT 
    'Polio_Sum' AS disease, country, year,
    COALESCE(SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END), 'NaN') AS number,
    COALESCE(SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END), 'NaN') AS rate
FROM cases
GROUP BY country, year
;
INSERT INTO cases 
    SELECT 
        disease,
        country,
        year,
        SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND number <> 'NaN' THEN number END) AS number,
        SUM(CASE WHEN disease IN ('Diphtheria', 'Tetanus', 'Pertussis') AND rate <> 'NaN' THEN rate END) AS rate            
    FROM cases
    GROUP BY 1, 2, 3
    UNION ALL
    SELECT 
        disease,
        country,
        year,
        SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND number <> 'NaN' THEN number END) AS number,
        SUM(CASE WHEN disease IN ('Measles', 'Mumps', 'Rubella') AND rate <> 'NaN' THEN rate END) AS rate            
    FROM cases
    GROUP BY 1, 2, 3
    UNION ALL
    SELECT 
        disease,
        country,
        year,
        SUM(CASE WHEN disease IN ('Polio') AND number <> 'NaN' THEN number END) AS number,
        SUM(CASE WHEN disease IN ('Polio') AND rate <> 'NaN' THEN rate END) AS rate            
    FROM cases
    GROUP BY 1, 2, 3