代码之家  ›  专栏  ›  技术社区  ›  menteith

聚合查询中的结果

  •  -2
  • menteith  · 技术社区  · 1 年前

    我在Postgres中有以下表格(简化版):

    CREATE TABLE party(
        id int PRIMARY KEY,
        family_name varchar(50) NOT NULL
    );
    
    CREATE TABLE election(
        id int,
        country_name varchar(50) NOT NULL,
        e_type election_type NOT NULL,
        e_date date NOT NULL,
        vote_share numeric,
        seats int,
        seats_total int NOT NULL,
        party_name_short varchar(10) NOT NULL,
        party_name varchar(255) NOT NULL,
        party_name_english varchar(255) NOT NULL,
        party_id int REFERENCES party(id)
    );
    

    我想知道某个政党家族(保守党、社会民主党等)是如何在选举中获胜的。为此,我写了一个简单的查询:

    SELECT
        e.country_name,
        extract(year FROM e.e_date) AS year,
        sum(e.vote_share) AS vote_share
    FROM
        election e
        JOIN party p ON e.party_id = p.id
    WHERE
        e.e_type = 'parliament'
        AND p.family_name IN ('Green/Ecologist')
        AND e.country_name = 'Austria'
        AND e.e_date >= '1980-01-01'::date
        AND e.e_date < '2020-01-01'::date
    GROUP BY
        e.country_name,
        e.e_date,
        e.vote_share;
    

    它几乎满足了我的要求。请让我给你看看结果:

    |country_name|year |vote_share|
    |------------|-----|----------|
    |Austria     |1983|1.4       |
    |Austria     |1983|2         |
    |Austria     |1986|4.8       |
    |Austria     |1990|2         |
    |Austria     |1990|4.8       |
    

    正如您所看到的,该查询不是显示投票份额的总和,而是显示每个政党的投票份额。1983年有两个结果:1、4和2,因为那次选举有两个政党。我想要的投票份额总和。我该怎么做?

    预期结果:

    |country_name|year |vote_share|
    |------------|-----|----------|
    |Austria     |1983|1.4 + 2    |
    |Austria     |1986|4.8        |
    |Austria     |1990|2 + 4,8    |
    
    1 回复  |  直到 1 年前
        1
  •  0
  •   zip    1 年前

    这是下面的查询:

    SELECT
        e.country_name,
        extract(year FROM e.e_date) AS year,
        sum(e.vote_share) AS vote_share
    FROM
        election e
        JOIN party p ON e.party_id = p.id
    WHERE
        e.e_type = 'parliament'
        AND p.family_name IN ('Green/Ecologist')
        AND e.country_name = 'Austria'
        AND e.e_date >= '1980-01-01'::date
        AND e.e_date < '2020-01-01'::date
    GROUP BY
        e.country_name,
        e.e_date,
        e.vote_share;
    

    你在vote_share上求和,很好,但不要在vote_share上分组。

    这样可以做到:

    SELECT
        e.country_name,
        extract(year FROM e.e_date) AS year,
        sum(e.vote_share) AS vote_share
    FROM
        election e
        JOIN party p ON e.party_id = p.id
    WHERE
        e.e_type = 'parliament'
        AND p.family_name IN ('Green/Ecologist')
        AND e.country_name = 'Austria'
        AND e.e_date >= '1980-01-01'::date
        AND e.e_date < '2020-01-01'::date
    GROUP BY
        e.country_name,
        e.e_date