首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在表中添加行,其形式为其他行的总和。

在表中添加行,其形式为其他行的总和。
EN

Stack Overflow用户
提问于 2018-05-14 08:28:51
回答 2查看 62关注 0票数 0

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

我有一张像这样的桌子cases

代码语言:javascript
复制
  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
 ...        | ...                                   |  ... |       ... |    ...  

我想要添加一些行,计算为一些值的和。我试着更好地解释自己。

以下查询计算白喉、破伤风、百日咳(和其他.)值的数目和比率值之和。并创建带有求和值的行。

查询:

代码语言:javascript
复制
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;

执行结果:

我想将这些结果添加到cases表中,以便得到如下内容:

代码语言:javascript
复制
  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
 DTP        | Austria                               | 1989 |    190.00 |   2.47
 MMR        | Austria                               | 1989 |      0.00 |   0.00
 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
 DTP        | Belgium                               | 1989 |    186.00 |   2.47
 MMR        | Belgium                               | 1989 |   2052.00 |  50.00
 ...        | ...                                   |  ... |       ... |    ...  

我该怎么做?我曾想过使用这样的查询:

代码语言:javascript
复制
    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
    );

但我要在列名里放什么?

编辑1

我的cases表是这样创建的:

代码语言:javascript
复制
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));

当我运行Pham X. Bach创建的查询时,我得到:

代码语言:javascript
复制
ERROR:  ERROR:  null values in the "number" column violate the non-null constraint
DETAIL:  The error line contains (8077, DTP, Poland, 2015, null, null).

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

代码语言:javascript
复制
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));

然后我执行你的查询,我得到:

代码语言:javascript
复制
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行中会出现语法错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-14 08:40:38

你可以用这个:

代码语言:javascript
复制
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
;
票数 0
EN

Stack Overflow用户

发布于 2018-05-14 08:43:12

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50325995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档