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